如何在一个列上加入多个列?

时间:2017-04-05 06:50:12

标签: sql oracle plsql

我一直试图获得每个月子组数据的计数。问题表中有一个名为subgroup的列,还有sdate列,它保存插入日期。我想在几个月内获得所有子组计数。所以我可以看到每个子组在一个月内插入了多少数据。

到目前为止我有这个查询,这适用于1个子组。我想添加其他子组。

SELECT all_months.month "Month", COUNT(QUESTIONS.SUBGROUP) AS FI
            FROM(SELECT LEVEL AS month FROM DUAL CONNECT BY LEVEL <= 12) all_months
LEFT OUTER JOIN QUESTIONS ON(all_months.month = EXTRACT(MONTH FROM SDATE) AND 
SUBGROUP='FI' AND EXTRACT(YEAR FROM SDATE) = EXTRACT(YEAR FROM SYSDATE)) 
GROUP BY all_months.month ORDER BY "Month" ASC;

此查询返回:

result

这就是我想要的。

what i want

提前致谢。

1 个答案:

答案 0 :(得分:2)

您可以使用条件聚合

SELECT all_months.month "Month", 
       COUNT(CASE WHEN QUESTIONS.SUBGROUP = 'FI' THEN 1 END) AS FI,
       COUNT(CASE WHEN QUESTIONS.SUBGROUP = 'G1' THEN 1 END) AS G1,
       COUNT(CASE WHEN QUESTIONS.SUBGROUP = 'G2' THEN 1 END) AS G2,
       COUNT(CASE WHEN QUESTIONS.SUBGROUP = 'G3' THEN 1 END) AS G3
FROM ( 
   SELECT LEVEL AS month 
   FROM DUAL CONNECT BY LEVEL <= 12) all_months
   LEFT OUTER JOIN QUESTIONS 
     ON(all_months.month = EXTRACT(MONTH FROM SDATE) AND 
     SUBGROUP IN ('FI', 'G1', 'G2', 'G3') AND 
     EXTRACT(YEAR FROM SDATE) = EXTRACT(YEAR FROM SYSDATE) ) AS t 
GROUP BY all_months.month 
ORDER BY "Month" ASC;