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
PIVOT在SQL Sever里面和Oracle里面的用法区别