在Oracle中,给出以下数据
+------------+-----+
+ STATUS | GRP +
+------------+-----+
+ Pass | A +
+ Fail | A +
+ Pass | A +
+ Pass | B +
+ Fail | B +
+ Pass | C +
+ bad | C +
+------------------+
我想得到以下结果
+---------+-------+-------+-------+
+ GRP | Total + Pass + Fail +
+---------+-------+-------+-------+
+ A | 3 + 2 + 1 +
+ B | 2 + 1 + 1 +
+ C | 2 + 1 + 0 +
+---------+-------+-------+-------+
是否可以使用一个SQL查询执行此操作,还是需要进行三次单独的SQL调用?
答案 0 :(得分:9)
您可以使用SQL分组以及COUNT()和SUM()聚合函数执行此操作。对于SUM,我们使用嵌入式CASE语句的标准SQL“技巧”。
select GRP, COUNT(*) as Total,
SUM(CASE WHEN STATUS = 'Pass' THEN 1 ELSE 0 END) AS Pass,
SUM(CASE WHEN STATUS = 'Fail' THEN 1 ELSE 0 END) AS Fail
from table
group by GRP
<强>平均强> 使用相同的技巧来获得平均值,知道AVG聚合将忽略任何无效的参数。
select GRP, COUNT(*) as Total,
SUM(CASE WHEN STATUS = 'Pass' THEN 1 ELSE 0 END) AS Pass,
SUM(CASE WHEN STATUS = 'Fail' THEN 1 ELSE 0 END) AS Fail,
AVG(CASE WHEN STATUS = 'Pass' THEN Score ELSE null END) AS PassAVG,
AVG(CASE WHEN STATUS = 'Fail' THEN Score ELSE null END) AS FailAVG,
from table
group by GRP
答案 1 :(得分:0)
这是你在找什么?
SELECT s.GRP, (SELECT COUNT(*) FROM stats ss WHERE s.GRP = ss.GRP) AS Total,
(SELECT COUNT(*) FROM stats ss WHERE s.GRP = ss.GRP AND ss.status = 'Pass')
AS Pass,
(SELECT COUNT(*) FROM stats ss WHERE s.GRP = ss.GRP AND ss.status = 'Fail')
AS Fail
FROM stats s GROUP BY GRP;