选择多个COUNT

Arc*_*ano 2 sql oracle

在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调用?

Hog*_*gan 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
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)