在Oracle中,给出以下数据
+------------+-----+
+ STATUS | GRP +
+------------+-----+
+ Pass | A +
+ Fail | A +
+ Pass | A +
+ Pass | B +
+ Fail | B +
+ Pass | C +
+ bad | C +
+------------------+
Run Code Online (Sandbox Code Playgroud)
我想得到以下结果
+---------+-------+-------+-------+
+ GRP | Total + Pass + Fail +
+---------+-------+-------+-------+
+ A | 3 + 2 + 1 +
+ B | 2 + 1 + 1 +
+ C | 2 + 1 + 0 +
+---------+-------+-------+-------+
Run Code Online (Sandbox Code Playgroud)
是否可以使用一个SQL查询执行此操作,还是需要进行三次单独的SQL调用?
您可以使用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
Run Code Online (Sandbox Code Playgroud)
平均 使用相同的技巧来获得平均值,知道AVG聚合将忽略任何null参数.
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
Run Code Online (Sandbox Code Playgroud)