【问题标题】:SQL grouped statement with count and percentageSQL group by 带有计数和百分比的语句
【发布时间】:2014-06-03 11:35:59
【问题描述】:

我有一个像这样的表(简化)

ID1  ID2  Status
---  ---  ------
1    33     0 
1    33     0 
1    33     1 
1    33     1 
1    34     1 
1    34     2 
2    33     0
2    33     0
2    34     0

我想计算按状态类型分组的状态总数,以及与特定 ID ID1 和 ID2 相关的状态数的百分比

一个示例输出是

ID1  ID2  Status   Count   Percentage
---  ---  ------   -----   ----------
1    33     0        2         50%
1    33     1        2         50%
1    34     1        1         50%
1    34     2        1         50%
2    33     0        2         100%
2    34     0        1         100%

到目前为止,我只能得到计数,但不能得到百分比。这是我现在的查询

select ID1, ID2 ,  status, count(ID2) as Count 
 from 
StatTable
 group by ID1, ID2, status

【问题讨论】:

    标签: sql sql-server sql-server-2008 group-by


    【解决方案1】:

    您可以通过使用窗口函数来获取每个id1、id2 组合的总数:

    select ID1, ID2 ,  status, count(*) as cnt,
           count(*) * 100.0 / count(*) over (partition by id1, id2) as Percentage
    from StatTable
    group by ID1, ID2, status;
    

    【讨论】:

    • 感谢您的回复。窗口函数是什么意思?我得到错误的百分比值。
    • 我正在尝试将 SUM 用于百分比计算。对于我表中的前四条记录,我有 2 条状态 = 0 和 2 条状态 = 1。所以总共有 4 条。因此 count(cnt) * 100 / SUM(ID2)... 是这样的吗?跨度>
    • @user20358 。 . .不。您似乎想根据您问题中的数据将id1,id2,status 的计数除以id1,id2 的计数。在称为id 的东西上使用sum() 似乎是个坏主意。窗口函数(使用 over 子句)的文档在这里:msdn.microsoft.com/en-us/library/ms189461(v=sql.105).aspx。
    • 抱歉,这是我的错误。我的意思是 count(ID2) * 100 / SUM(cnt)... 我知道这在 sql 中不会这样工作。目前我可以使用子查询获得百分比,但不确定这是否是最好的方法。它与您所做的非常相似,除了我将“count(*) over (partition by id1, id2)”替换为“select count(ID2) from stattable group by ID1”的部分
    • 仍然不确定我所做的方式是否是好方法。为之前的混乱道歉......
    【解决方案2】:

    我对 Gordon 查询进行了细微更改,现在它与您的预期答案匹配 -

    select ID1, ID2 ,  status, count(*) as cnt,
           100.0 / count(*) over (partition by id1, id2) as Percentage
    from table1TEmp
    group by ID1, ID2, status;
    

    【讨论】:

    • 从 gordon 查询中删除 100.0 之前的 count(*) *,您将开始得到正确答案。我用你的例子在我的机器上试过。
    【解决方案3】:

    这对我有用

    select ID1, ID2 ,  status, count(ID2) as cnt,
           count(ID2) * 100.0 / (select count(ID2) from StatTable group by ID1) as Percentage
    from StatTable
    group by ID1, ID2, status;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-28
      • 2018-04-05
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多