【问题标题】:NULL fields using PIVOT使用 PIVOT 的 NULL 字段
【发布时间】:2019-11-15 10:52:18
【问题描述】:

我请求您的合作,因为pivot 在一张表上并用null 分隔记录,但仍将字段保留为 0 和NVL

表格

product   | value
----------+-------
Shirts    | 1200
Caps      | 0
Stocks    | 0
Glasses   | 100
Shoes     | 0

科迪戈支点

select * from products
 PIVOT (sum(value)
   for titles in ('product', 'value')) AS pivot_product

结果:

 product  |  Shirts   |  Caps  |    Stocks   | Glasses | Shoes
 ---------+-----------+--------+-------------+---------+----------
   value  |    NULL   |  NULL  |    NULL     |   100   |   NULL
   value  |    1200   |  NULL  |    NULL     |   NULL  |   NULL

预期结果:

 product  |  Shirts   |  Caps  |    Stocks   | Glasses | Shoes
 ---------+-----------+--------+-------------+-------+----------
   valor  |    1200   |  NULL  |    NULL     |  100  |   NULL

可选

 product  |  Shirts   |  Caps  |    Stocks   | Glasses | Shoes
 ---------+-----------+--------+-------------+-------+----------
   valor  |    1200   |    0   |      0      |  100  |    0

【问题讨论】:

    标签: sql oracle oracle11g pivot


    【解决方案1】:

    您需要将列值放入数据透视表中:

    Oracle 设置

    CREATE TABLE test_data ( product, value ) AS
    SELECT 'Shirts', 1200 FROM DUAL UNION ALL
    SELECT 'Caps',      0 FROM DUAL UNION ALL
    SELECT 'Stocks',    0 FROM DUAL UNION ALL
    SELECT 'Glasses', 100 FROM DUAL UNION ALL
    SELECT 'Shoes',     0 FROM DUAL
    

    查询

    SELECT 'value' AS product,
           p.*
    FROM   test_data
    PIVOT ( SUM( value ) FOR product IN (
      'Shirts'  AS Shirts,
      'Caps'    AS Caps,
      'Stocks'  AS Stocks,
      'Glasses' AS Glasses,
      'Shoes'   AS Shoes
    ) ) p
    

    输出

    产品 |衬衫 |帽 |股票 |眼镜 |鞋 :-------- | -----: | ---: | -----: | ------: | ----: 价值 | 1200 | 0 | 0 | 100 | 0

    db小提琴here

    【讨论】:

    • 列是否有可能是动态的而不是手动的?
    【解决方案2】:

    只需使用条件聚合。它更灵活:

    select 'valor' as product,
           sum(case when product = 'Shirts' then value end) as shirts,
           sum(case when product = 'Caps' then value end) as caps,
           sum(case when product = 'Stocks' then value end) as stockes,
           sum(case when product = 'Shirts' then value end) as shirts,
           sum(case when product = 'Glasses' then value end) as glasses,
           sum(case when product = 'Shoes' then value end) as shoes
    from test_data;
    

    【讨论】:

      猜你喜欢
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      • 2018-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      相关资源
      最近更新 更多