首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Case语句中执行Count()和Avg()

在Case语句中执行Count()和Avg()
EN

Stack Overflow用户
提问于 2018-02-27 22:35:57
回答 2查看 2.3K关注 0票数 0

我使用这份个案陈述,显示按年龄组别分组的访港总人数及平均访港时间:

代码语言:javascript
复制
    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,

结果应该如下所示:

代码语言:javascript
复制
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   

谁能否认我做错了什么,或者更好的方法来达到最终的结果?提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-28 00:08:59

你提到了两点:

1)有人能回避我做错了什么吗?

  • 您在查询中使用的CASE表达式不正确。
  • CASE语句中满足某些条件时,不能返回2列。
  • 根据Microsoft文档CASE计算条件列表并返回多个可能的结果表达式之一。
  • 请查看此Microsoft白皮书,以获得进一步的研究参考。URL

2)实现最终结果的更好方法--

  • 要做到这一点,有很多种方法。
  • 下面是一个简单的方法。请尝试以下查询: 选择SUM(当AgeCalcSort =0和AgeCalcSort <= 1然后1其他0结束时)年龄1计数,Avg (当AgeCalcSort =0和AgeCalcSort <= 1,然后DATEDIFF(DATEDIFF,StartDate,EndDate)为空结束时)年龄1 Avg LOS SUM( AgeCalcSort =2,AgeCalcSort <= 17乘以1 SELECT 0)年龄2计数,Avg(当AgeCalcSort =2和AgeCalcSort <= 17,然后是DATEDIFF(DATEDIFF,StartDate,EndDate)空结束)年龄2 Avg LOS SUM(当AgeCalcSort = 18,<= StartDate= 64,然后其他0结束)年龄3,Avg (当AgeCalcSort = 18,AgeCalcSort <= 64,DATEDIFF(DATEDIFF,StartDate,EndDate)为空结束时)年龄3 Avg LOS (当AgeCalcSort 65 >= 1其他0结束时)年龄4,Avg(当AgeCalcSort >= 65,DATEDIFF(DATEDIFF,StartDate,EndDate)为空结束时)

查询解释

  • 我已经通过使用SUM实现了计数,如果您查看任何计数逻辑,当它满足条件1 of 0时,您会注意到它是这样写的。这将在后面使用SUM进行求和。因此,所有的1最终都会考虑到这一点。
  • 一般来说,您会注意到条件不满足,我使用NULL,这是有意的,以避免错误的数学。
  • 在TSQL查询中,AVG of (2,4,NULL)3,而AVG of (2,4,0)2。因此,在您的例子中,NULL将有助于避免扰乱平均值。
票数 1
EN

Stack Overflow用户

发布于 2018-02-27 22:52:10

case expression返回一个值,然后可以计数或平均值。

不可能从单个case expression产生多列输出。因此,对于每个想要的输出列,您需要一个case表达式,如下所示:

代码语言:javascript
复制
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,因此如果不满足条件,计数就不会增加。
  • 而to文档有时可以使用术语"case语句“,这在技术上是不正确的;例如,完整的select查询是一个”语句“,”表达式“计算为单个值,因此正确的术语是case expression
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49019083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档