Oracle SQL Pivot -- 获取行总计

Posted

技术标签:

【中文标题】Oracle SQL Pivot -- 获取行总计【英文标题】:Oracle SQL Pivot -- Getting Row Totals 【发布时间】:2020-08-31 21:54:09 【问题描述】:

我有以下疑问:

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

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

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

【问题讨论】:

能否提供一些示例数据和预期结果? 【参考方案1】:

我会推荐条件聚合:它比供应商特定的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 日时,您当前的谓词将过滤掉所有行。

【讨论】:

以上是关于Oracle SQL Pivot -- 获取行总计的主要内容,如果未能解决你的问题,请参考以下文章

带有条件的 Oracle SQL Pivot 将行转换为列

当行丢失时,用 Oracle SQL PIVOT 结果中的自定义值替换 NULL

在 Oracle 中计算并添加多列的总计行

Oracle SQL - 如何使用 PIVOT 进行计数

使用动态Pivot时的总(SUM)行

按组 SQL 运行总计 (Oracle)