SQl将where子句仅应用于一个字段

SQl将where子句仅应用于一个字段,sql,teradata,Sql,Teradata,我想对select查询的一个字段应用WHERE子句。互联网告诉我在选择字段的行中使用CASE,然后删除where子句。但后来我被告知我的“所选非聚合值必须是关联组的一部分。” 原始查询如下所示: SELECT CAST(EVENT_TIMESTAMP AS DATE) AS Date1, COUNT(DISTINCT EMAIL) END AS Subs, SUM(DWELL_MINUTES) AS Dwell FROM VwNIMEventFct INNER JO

我想对select查询的一个字段应用WHERE子句。互联网告诉我在选择字段的行中使用CASE,然后删除where子句。但后来我被告知我的“
所选非聚合值必须是关联组的一部分。”

原始查询如下所示:

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) 对于每个日期,订阅结束日期为空或将来(大于日期1)的不同电子邮件地址的计数, 3) 字段的和(我在这里很好)

我怎么做2号

根据答案编辑: select查询的这一部分是否会忽略空白记录,从而在 订阅结束日期为空

SELECT 
    COUNT(DISTINCT CASE  WHEN TmpNIMSalesForceDB.SUBSCRIPTION_END_DATE > Date1 OR TmpNIMSalesForceDB.SUBSCRIPTION_END_DATE IS NULL
             THEN TmpNIMSalesForceDB.EMAIL END) AS Subs, 

我需要统计订阅结束日期为空/空或日期在日期1之后的所有记录。

case
语句放入
count
函数中

SELECT 
    CAST(EVENT_TIMESTAMP AS DATE) AS Date1, 
    COUNT(DISTINCT(CASE 
             WHEN SUBSCRIPTION_END_DATE > Date1 OR SUBSCRIPTION_END_DATE IS NULL
             THEN 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

case
语句放入
count
函数中

SELECT 
    CAST(EVENT_TIMESTAMP AS DATE) AS Date1, 
    COUNT(DISTINCT(CASE 
             WHEN SUBSCRIPTION_END_DATE > Date1 OR SUBSCRIPTION_END_DATE IS NULL
             THEN 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

您需要将CASE语句放在计数中,而不是相反,因为它需要为每一行计算(这一行应该属于哪种情况),然后在每个组中进行聚合(该组中有多少行属于非空组)


计数将忽略由于CASE语句中缺少ELSE子句而隐式留下的空值,因此只计算满足条件的行中的不同电子邮件值。

您需要将CASE语句放在计数中,而不是相反,因为它需要为每行计算(该行应属于哪种情况)然后在每个组中进行聚合(该组中有多少行属于非空组)


计数将忽略由于CASE语句中缺少ELSE子句而隐式留下的空值,因此只计算满足条件的行中的不同电子邮件值。

“计数将忽略由于CASE语句中缺少ELSE子句而隐式留下的空值”,这会改变情况。我更改了查询并运行了它,这很好,但结果并不是我期望看到的结果。我需要包括当日期为空时不忽略-当订阅结束日期为空时计算电子邮件。我想你可能误解了。将CASE视为一个函数,它返回一些值以在输出中使用或传递给其他函数;如果行与指定条件匹配,则案例结果为指定值;如果不匹配任何条件,则使用ELSE子句的值;如果没有其他选项,则结果为空。这与正在检查的输入是否包含空值无关。啊,是的,我误解了。因此,条件是满足的-做的事情(计数)。看起来我有另一个问题,因为数字不是预期的。感谢您在这一部分提供的帮助。看看您的问题,原始查询与VwNIMEventFct.EVENT_TIMESTAMP进行了比较,但修改后的查询与Date1进行了比较。这可以解释您当前的差异吗?Date1是从VwNIMEventFct.EVENT\u时间戳派生的。我原以为就是这样。仍在调查“计数将忽略CASE语句中缺少ELSE子句而隐式留下的null”,这改变了情况。我更改了查询并运行了它,这很好,但结果并不是我期望看到的结果。我需要包括当日期为空时不忽略-当订阅结束日期为空时计算电子邮件。我想你可能误解了。将CASE视为一个函数,它返回一些值以在输出中使用或传递给其他函数;如果行与指定条件匹配,则案例结果为指定值;如果不匹配任何条件,则使用ELSE子句的值;如果没有其他选项,则结果为空。这与正在检查的输入是否包含空值无关。啊,是的,我误解了。因此,条件是满足的-做的事情(计数)。看起来我有另一个问题,因为数字不是预期的。感谢您在这一部分提供的帮助。看看您的问题,原始查询与VwNIMEventFct.EVENT_TIMESTAMP进行了比较,但修改后的查询与Date1进行了比较。这可以解释您当前的差异吗?Date1是从VwNIMEventFct.EVENT\u时间戳派生的。我原以为就是这样。仍在调查这有点难说,因为没有样本数据,但我认为您必须将电子邮件添加到GROUPBY子句中,而不是使用DISTINCT。然后你可以将“sum(case…1 else 0 end)作为Subs”这有点难说,因为没有样本数据,但我认为你必须将EMAIL添加到groupby子句中,而不是使用DISTINCT。然后您可以将“sum(case…1或0 end)作为Subs”