SQl将where子句仅应用于一个字段
我想对select查询的一个字段应用WHERE子句。互联网告诉我在选择字段的行中使用CASE,然后删除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
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”