首页 > 解决方案 > Oracle SQL Pivot -- 获取行总计

问题描述

我有以下查询:

SELECT *
FROM

(
SELECT COUNT (APP_AUTOMATIC_NUMBER) AS RECORD_COUNT, LETTER_TYPE_ID, 
TO_DATE (EXTRACT_DATE, 'MMDDYYYY') AS EXTRACT_DATE,
'Consumer' AS ACCT_TYPE

FROM [TABLE_NAME]

WHERE SUBSTR(EXTRACT_DATE, -4) = '2020' and EXTRACT_DATE between TO_CHAR( (sysdate - 6), 'MMDDYYYY' ) and TO_CHAR( (sysdate - 4), 'MMDDYYYY' )

GROUP BY CUBE (LETTER_TYPE_ID, EXTRACT_DATE)
) t

PIVOT(
    SUM(RECORD_COUNT) 
    FOR LETTER_TYPE_ID IN (
        1,10,11,12,13,14,4,7,9)
)
ORDER BY EXTRACT_DATE

它将在屏幕截图中返回结果(见下文),它对列进行总计,但我想对行进行总计。因此,改为获取每天的总记录数......而不是按列显示总数。

这似乎是一个常见问题,但是我试图在互联网上搜索一个直截了当的答案感到很沮丧。

在此处输入图像描述

标签: sqlstringoraclecountpivot

解决方案


我会推荐条件聚合:它比特定于供应商的pivot语法更灵活,这使得做你想做的事情变得更容易。

select 
    to_date (extract_date, 'mmddyyyy') as extract_date,
    'Consumer' as acct_type
    sum(case when letter_type_id =  1 then 1 else 0 end) as type_1,
    sum(case when letter_type_id = 10 then 1 else 0 end) as type_10,
    ...
    sum(case when letter_type_id =  9 then 1 else 0 end) as type_9,
    count(*) type_total
from mytable 
where 
    letter_type_id in ( 1,10,11,12,13,14,4,7,9)
    and extract_date between to_char(sysdate - 6, 'mmddyyyy') and to_char(sysdate - 4, 'mmddyyyy')
    and substr(extract, -4) = '2020'
group by 1
order by 1

旁注:我不清楚where子句中日期的过滤逻辑:当您的服务器的系统日期达到 2021 年 1 月 6 日时,您当前的谓词将过滤掉所有行。


推荐阅读