您可以嵌套SQL以避免复制SUM和CASE表达式:
SELECT USER_ID,
Package1,
Package2,
Package3,
(Package1 + Package2 + Package3) AS TOTAL
FROM
( SELECT USER_ID,
sum(case SERVICETYPE_ID WHEN 1 THEN 1 ELSE 0 END) AS Package1,
SUM(CASE SERVICETYPE_ID WHEN 2 THEN 1 ELSE 0 END) AS Package2,
SUM(CASE SERVICETYPE_ID WHEN 3 THEN 1 ELSE 0 END) AS Package3
FROM ALL_ADSL
WHERE ACTIVATION_DATE BETWEEN pStartDate AND pEndDate
group by USER_ID
)
ORDER BY USER_ID;
或者,如果总共只有3种服务类型,则可以执行以下操作:
SELECT USER_ID,
sum(case SERVICETYPE_ID WHEN 1 THEN 1 ELSE 0 END) AS Package1,
SUM(CASE SERVICETYPE_ID WHEN 2 THEN 1 ELSE 0 END) AS Package2,
SUM(CASE SERVICETYPE_ID WHEN 3 THEN 1 ELSE 0 END) AS Package3
COUNT(*) AS Total
FROM ALL_ADSL
WHERE ACTIVATION_DATE BETWEEN pStartDate AND pEndDate
group by USER_ID
ORDER BY USER_ID;
或者如果有其他服务类型要排除,则
SELECT USER_ID,
sum(case SERVICETYPE_ID WHEN 1 THEN 1 ELSE 0 END) AS Package1,
SUM(CASE SERVICETYPE_ID WHEN 2 THEN 1 ELSE 0 END) AS Package2,
SUM(CASE SERVICETYPE_ID WHEN 3 THEN 1 ELSE 0 END) AS Package3
SUM(CASE WHEN SERVICETYPE_ID IN (1,2,3) THEN 1 ELSE 0 END) AS Total
FROM ALL_ADSL
WHERE ACTIVATION_DATE BETWEEN pStartDate AND pEndDate
group by USER_ID
ORDER BY USER_ID;