【问题标题】:How to get count(percentage) for columns after each groupby item?如何在每个分组项之后获取列的计数(百分比)?
【发布时间】:2022-01-17 11:17:42
【问题描述】:

我有下表。使用sqliteDB

Item Result
A Pass
B Pass
A Fail
B Fail

我想使用一些查询来实现上表如下。

Item Total Accept Reject
A 2 1(50%) 1(50%)
B 2 1(50%) 1(50%)

我应该如何构造这个查询?

【问题讨论】:

  • 请标记您正在使用的 DBMS。

标签: sql sqlite


【解决方案1】:

如果您的 DBMS 支持,您可以尝试PIVOT()。然后根据 DMBS 使用 CONCAT|| 运算符。

查询:

SELECT 
    item, 
    total, 
    SUM(Pass)||'('|| CAST((SUM(Pass)*1.0/total*1.0)*100.0 AS DECIMAL)||'%)' AS Accept, 
    SUM(Fail)||'('|| CAST((SUM(Fail)*1.0/total*1.0)*100.0 AS DECIMAL)||'%)' AS Reject
FROM 
    (
     SELECT 
         Item, 
         result,
         COUNT(result) OVER(PARTITION BY item ORDER BY result ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS total,
         CASE
           WHEN Result = 'Pass' then 1
           ELSE 0
         END AS Pass,
         CASE
           WHEN Result = 'Fail' then 1
           ELSE 0
         END AS Fail
     FROM t
    ) AS j
GROUP BY item, total

查询说明:

  1. 由于SQLITE 不处理PIVOT,我们正在使用CASE 语句手动创建标志Pass 和Fail
  2. 为了计算total,这里使用COUNT作为解析函数。它基本上是计算计数并将其放置在所有行中的快捷方式
  3. 然后在外部查询中,我们正在计算 %s 并使用 || 作为连接运算符来连接结果与总和和其中的百分比

db<>fiddle

中查看演示

【讨论】:

  • 感谢@arun,我正在使用 sqlite,但似乎没有 PIVOT 方法
  • @BizBaker,更新了答案。请试试这个。
  • 谢谢我看到它现在工作了。我可能会在这里推动它,但是否可以解释逻辑以便下次我可以自己编写:-)
  • 还做了一个小改动,增加了 ROUND 方法以限制小数位 SUM(Pass)||'('|| CAST(Round((SUM(Pass)* 1.0/total*1.0),2)*100.0 AS DECIMAL)||'%)' AS Accept, SUM(Fail)||'('|| CAST(Round((SUM(Fail)*1.0/总计*1.0),2)*100.0 AS DECIMAL)||'%)' AS 拒绝
  • @BizBaker,是的,ROUND 将有助于处理小数位。已用解释更新了答案。 HTH!
猜你喜欢
  • 2019-04-09
  • 2020-10-19
  • 2017-11-12
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多