选择多个COUNT

时间:2013-08-30 16:33:32

标签: sql oracle

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

2 个答案:

答案 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;