【问题标题】:Oracle SQL - Updating a value before PIVOTOracle SQL - 在 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。

谢谢

【问题讨论】:

    标签: sql oracle datetime pivot case


    【解决方案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 视为一个字符串(这就是它的样子)——即使只有数字的错误也用单引号括起来;使用正确的数据类型总是比依赖隐式转换更好(并且有时会避免违反直觉的行为)

    【讨论】:

      猜你喜欢
      • 2016-06-11
      • 2021-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-24
      • 2023-03-31
      • 1970-01-01
      相关资源
      最近更新 更多