【发布时间】:2014-07-15 17:00:26
【问题描述】:
我想将 WHERE 子句应用于我的选择查询的一个字段。互联网告诉我在选择字段的行中使用 CASE WHEN,然后删除 where 子句。但后来有人告诉我,我的“selected non aggregate values must be part of the associated group."
原始查询如下所示:
SELECT
CAST(EVENT_TIMESTAMP AS DATE) AS Date1,
COUNT(DISTINCT EMAIL) END AS Subs,
SUM(DWELL_MINUTES) AS Dwell
FROM VwNIMEventFct
INNER JOIN VwNIMUserDim ON VwNIMUserDim.NIM_USER_ID = VwNIMEventFct.NIM_USER_ID
INNER JOIN TmpNIMSalesForceDB ON VwNIMUserDim.USER_EMAIL_ADDRESS = EMAIL
WHERE Date1 >= '2013-11-01'
// The problem is here, in the AND clause
AND (SUBSCRIPTION_END_DATE > VwNIMEventFct.EVENT_TIMESTAMP OR SUBSCRIPTION_END_DATE
IS NULL)
GROUP BY Date1
ORDER BY Date1
然后我在做一些搜索后更改了查询:
SELECT
CAST(EVENT_TIMESTAMP AS DATE) AS Date1,
CASE WHEN (SUBSCRIPTION_END_DATE > Date1 OR SUBSCRIPTION_END_DATE IS NULL)
THEN COUNT(DISTINCT TmpNIMSalesForceDB.EMAIL) END AS Subs,
SUM(VwNIMEventFct.DWELL_MINUTES) AS Dwell
FROM RDMAVWSANDBOX.VwNIMEventFct
INNER JOIN VwNIMUserDim ON VwNIMUserDim.NIM_USER_ID = VwNIMEventFct.NIM_USER_ID
INNER JOIN TmpNIMSalesForceDB ON VwNIMUserDim.USER_EMAIL_ADDRESS = EMAIL
WHERE Date1 >= '2013-11-01'
GROUP BY Date1
ORDER BY Date1
我想选择: 1)查询中的“Date1”日期,然后, 2) 对于每个日期,SUBSCRIPTION_END_DATE 为 NULL 或将来(大于 Date1)的不同电子邮件地址的计数, 3)一个字段的总和(我这里很好)
第 2 点怎么做?
根据答案编辑: 选择查询的这一部分是否忽略并因此不计算空白记录 SUBSCRIPTION_END_DATE 为空?
SELECT
COUNT(DISTINCT CASE WHEN TmpNIMSalesForceDB.SUBSCRIPTION_END_DATE > Date1 OR TmpNIMSalesForceDB.SUBSCRIPTION_END_DATE IS NULL
THEN TmpNIMSalesForceDB.EMAIL END) AS Subs,
我需要计算 SUBSCRIPTION_END_DATE 为空白/null 或这些日期在 Date1 之后的所有记录。
【问题讨论】: