我使用这份个案陈述,显示按年龄组别分组的访港总人数及平均访港时间:
CASE WHEN AgeCalcSort = 0 AND AgeCalcSort <= 1 then (
Count(VisitID),
AVG(DATEDIFF(dd,StartDate,EndDate ))
)
WHEN AgeCalcSort >= 2 AND AgeCalcSort <= 17 then (
Count(VisitID),
AVG(DATEDIFF(dd,StartDate,EndDate ))
)
WHEN AgeCalcSort >= 18 AND AgeCalcSort <= 64 then (
Count(VisitID),
AVG(DATEDIFF(dd,StartDate,EndDate ))
)
WHEN AgeCalcSort >= 65 then (
Count(VisitID),
AVG(DATEDIFF(dd,StartDate,EndDate ))
)
END,结果应该如下所示:
Age 1 Count Age 1 Avg LOS Age 2 Count Age 1 Avg LOS Age 3 Count Age 3 Avg LOS Age 4 Count Age 4 Avg LOS
5 5.3 18 9.2 20 12 0 0 谁能否认我做错了什么,或者更好的方法来达到最终的结果?提前谢谢。
发布于 2018-02-28 00:08:59
你提到了两点:
1)有人能回避我做错了什么吗?
CASE表达式不正确。CASE语句中满足某些条件时,不能返回2列。CASE计算条件列表并返回多个可能的结果表达式之一。2)实现最终结果的更好方法--
查询解释
SUM实现了计数,如果您查看任何计数逻辑,当它满足条件1 of 0时,您会注意到它是这样写的。这将在后面使用SUM进行求和。因此,所有的1最终都会考虑到这一点。NULL,这是有意的,以避免错误的数学。AVG of (2,4,NULL)是3,而AVG of (2,4,0)是2。因此,在您的例子中,NULL将有助于避免扰乱平均值。发布于 2018-02-27 22:52:10
case expression返回一个值,然后可以计数或平均值。
不可能从单个case expression产生多列输出。因此,对于每个想要的输出列,您需要一个case表达式,如下所示:
select
COUNT(CASE WHEN AgeCalcSort = 0 AND AgeCalcSort <= 1 then VisitID end)
, AVG(CASE WHEN AgeCalcSort = 0 AND AgeCalcSort <= 1 then DATEDIFF(dd,StartDate,EndDate ) end)
, COUNT(CASE WHEN AgeCalcSort = 2 AND AgeCalcSort <= 17 then VisitID end)
, AVG(CASE WHEN AgeCalcSort = 2 AND AgeCalcSort <= 17 then DATEDIFF(dd,StartDate,EndDate ) end)
, COUNT(CASE WHEN AgeCalcSort = 18 AND AgeCalcSort <= 64 then VisitID end)
, AVG(CASE WHEN AgeCalcSort = 18 AND AgeCalcSort <= 64 then DATEDIFF(dd,StartDate,EndDate ) end)
, COUNT(CASE WHEN AgeCalcSort = 65 then VisitID end)
, AVG(CASE WHEN AgeCalcSort = 65 then DATEDIFF(dd,StartDate,EndDate ) end)
from ...备注:
count()函数忽略NULL,因此如果不满足条件,计数就不会增加。case expression。https://stackoverflow.com/questions/49019083
复制相似问题