Oracle SQL - 在 PIVOT 之前更新值

Posted

技术标签:

【中文标题】Oracle SQL - 在 PIVOT 之前更新值【英文标题】:Oracle SQL - Updating a value before PIVOT 【发布时间】:2020-08-28 20:05:17 【问题描述】:

团队--

我有以下代码可以正常工作并根据需要创建 PIVOT 表结果集。

SELECT *
FROM
(
SELECT a.APP_AUTOMATIC_NUMBER, a.LETTER_TYPE_ID, TRUNC (EXTRACT_DATE), 'Commercial' AS ACCT_TYPE
FROM [TABLE_NAME] a
WHERE EXTRACT_DATE BETWEEN SYSDATE-7 AND SYSDATE -4 AND a.ACTIVE_FLAG ='ACTIVE'
) t
PIVOT(
    COUNT(APP_AUTOMATIC_NUMBER) 
    FOR LETTER_TYPE_ID IN (
        1,13,9,'L13')
)

但是,“L13”的 PIVOT 表中的值应该是 / 可以与返回的其他 13 个一起折叠。基本上13和L13是一回事。

有没有办法在我的查询中更新 L13 到 13 的记录?我无权更新源表。但我认为必须有一种方法可以在我的代码中使用 CASE 或其他语句将 L13 更新到 13。

谢谢

【问题讨论】:

【参考方案1】:

我会推荐条件聚合而不是 pivot:它比这种特定于供应商的语法灵活得多,并且可以轻松适应您的用例。

select
    trunc(extract_date) extract_day,
    'commercial' as acct_type,
    count(case when letter_type_id = '1' then app_automatic_number end) app_automatic_number_1,
    count(case when letter_type_id in ('12', 'L13') then app_automatic_number end) app_automatic_number_13,
    count(case when letter_type_id = '9' then app_automatic_number end) app_automatic_number_9
from table_name
where 
    extract_date between sysdate-7 and sysdate -4 
    and active_flag = 'active'
group by trunc(extract_date)

注意事项:

除非app_automatic_number 可能包含null 值,否则条件表达式会更好写:sum(case when letter_type_id = '1' then 1 else 0 end)

此查询始终将letter_type_id 视为一个字符串(这就是它的样子)——即使只有数字的错误也用单引号括起来;使用正确的数据类型总是比依赖隐式转换更好(并且有时会避免违反直觉的行为)

【讨论】:

以上是关于Oracle SQL - 在 PIVOT 之前更新值的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE SQL:如何在 Pivot 函数中将 NULL 替换为 0

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

PIVOT在SQL Sever里面和Oracle里面的用法区别

Oracle sql 中的 PIVOT

Oracle SQL Developer:如何使用 PIVOT 函数将行转置为列

Oracle SQL group by 查询,一种 PIVOT [重复]