首页 > 解决方案 > 在一个引用另一个子查询中的表的子查询中添加 where 条件 (ANSI SQL)

问题描述

在子查询“二”中,我想添加一个基于子查询“一”中的列的 where 条件,也就是说,我想 WHERE one."Call Type" = 'Demo'在我的第二个子查询中添加,但这给了我一个别名错误。基本上,在“二”中,我只想要表“一”中给出的调用类型=演示的那些行的计数(最终目标是找到代码中提到的两个计数的比率)。关于如何实现这一点的任何建议?

SELECT
         COALESCE(one.Period, two.Period) AS Period,
         one.TotalDemos,
         two.TotalTrials,
         Round(100.0 * one.TotalDemos / two.TotalTrials, 2) AS percentage
FROM (  SELECT
             "Call Date" AS Period,
             COUNT(*) AS TotalDemos
    FROM  "customer_calls" 
    WHERE    "Call Type"  = 'Demo'
    GROUP BY  Period 
) AS  one
FULL OUTER JOIN(    SELECT
             "modified" AS Period,
             COUNT(*) AS TotalTrials
    FROM  "users" 
    WHERE    "customertype"  = 0
    GROUP BY  Period 
) AS  two ON one.Period  = two.Period

编辑 - 我的期间值是日期戳(日期 - 时间),而我想要按年而不是按天的聚合或比率/百分比。不知道如何在这里使用合并来完成。对此的任何帮助也会很棒。

标签: sql

解决方案


根据您提供的表定义,您可以使用Common Table Expressions (CTE)实现您所追求的目标。下面的查询提供的示例。

Period但是,我们不建议您尝试仅通过 来确定已进行演示调用的用户。如果我的假设Period是日期/时间持续时间,那么您的查询很可能无法达到您想要的效果(即您将获得来自查询的记录,这些记录不会是演示调用)。为了使查询精确,您必须确定实际表之间的连接customer_calls以及users查询是否有效。

另外,另一个小警告,我通常不建议使用FULL OUTER JOIN它,因为它会返回两个表中的每条记录,这意味着你会有很多你不想要的记录(即one不加入的行two反之亦然)。INNER JOIN假设您非常了解数据库/表结构就足够了。

;WITH [one] AS (
    SELECT
         "Call Date" AS Period,
         COUNT(*) AS TotalDemos
    FROM  "customer_calls" 
    WHERE    "Call Type"  = 'Demo'
    GROUP BY  Period
), [two] AS (
    SELECT
         "modified" AS Period,
         COUNT(*) AS TotalTrials
    FROM  "users" 
    WHERE    "customertype"  = 0
        AND Period IN (SELECT Period FROM [one])
    GROUP BY  Period
)
SELECT
         COALESCE(one.Period, two.Period) AS Period,
         one.TotalDemos,
         two.TotalTrials,
         Round(100.0 * one.TotalDemos / two.TotalTrials, 2) AS percentage
FROM one
FULL OUTER JOIN two 
    ON one.Period = two.period

推荐阅读