在一个SQL查询中将两个COUNT()合并

4

我有以下的Oracle SQL查询:

SELECT ST.hrs_source_id, 
       TT.hrs_source_name, 
       Count(*) 
FROM   ps_hrs_app_profile P, 
       ps_hrs_rcmnt_sts S, 
       ps_hrs_al_log_srce ST, 
       ps_hrs_source TT 
WHERE  ST.hrs_source_id = TT.hrs_source_id 
       AND P.hrs_person_id = S.hrs_person_id 
       AND P.hrs_al_log_id = ST.hrs_al_log_id 
       AND S.status_code = '010' 
       AND S.status_dt BETWEEN '01-JAN-09' AND '31-MAR-16' 
GROUP  BY ST.hrs_source_id, 
          TT.hrs_source_name 
ORDER  BY TT.hrs_source_name ASC; 

上述查询结果包含3列: HRS_SOURCE_IDHRS_SOURCE_NAMECOUNT。但我想将两个COUNT连接成一个查询。第二个查询与上面相同,但只有STATUS_CODE应该等于'060',而在第一个查询中它等于'010'。如何在一个查询中将两个COUNT连接在一起,以便总共有4列?请帮忙解决。

1
顺便提一下,请务必修复您的 AND S.status_dt BETWEEN '01-JAN-09' AND '31-MAR-16',这样Oracle就不必将您的字符串隐式转换为日期了。日期应该有四位数的年份。您需要像这样:AND S.status_dt BETWEEN to_date('01/01/2009', 'dd/mm/yyyy') AND to_date('31/03/2016', 'dd/mm/yyyy')。此外,请注意,如果您的status_dt列包含除午夜以外的时间,您将排除在3月31日午夜之后的任何内容。也就是说,一个status_dt为 31/03/2016 00:00:01 的行将不会包含在您的查询结果中。 - Boneist
1个回答

8
您可以使用case表达式来获取不同的计数:
SELECT ST.HRS_SOURCE_ID, 
       TT.HRS_SOURCE_NAME, 
       COUNT(case when S.STATUS_CODE = '060' then 1 end) as cnt60, 
       count(case when S.STATUS_CODE = '010' then 1 end) as cnt10
FROM PS_HRS_APP_PROFILE P, PS_HRS_RCMNT_STS S, PS_HRS_AL_LOG_SRCE ST, PS_HRS_SOURCE TT
WHERE ST.HRS_SOURCE_ID = TT.HRS_SOURCE_ID
   AND P.HRS_PERSON_ID = S.HRS_PERSON_ID
   AND P.HRS_AL_LOG_ID = ST.HRS_AL_LOG_ID
   AND (S.STATUS_CODE = '010' or S.STATUS_CODE = '060')
   AND S.STATUS_DT BETWEEN '01-JAN-09' AND '31-MAR-16'
GROUP BY ST.HRS_SOURCE_ID, TT.HRS_SOURCE_NAME
ORDER BY TT.HRS_SOURCE_NAME ASC

注意where子句中的OR。

您可能更好地理解总和与计数的组合:

sum(case when S.STATUS_CODE = '060' then 1 else 0 end) cnt60

为了解释查询中的情况,没有else。如果状态与060不同,则case返回的值为nullnull不计入count

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接