【问题标题】:Add null values when pivoting SQL - Oracle透视 SQL 时添加空值 - Oracle
【发布时间】:2022-12-21 13:44:22
【问题描述】:

我有一张按日期排序的股票价格表。我只有那 5 只股票,但我有数百个日期。我想调整股票,但我不知道该怎么做。

数据:

   Date   |Stock| Price |
 30/09/22 |  A  | 100.5 |
 30/09/22 |  B  | 151.3 | 
 30/09/22 |  C  | 233.4 | 
 30/09/22 |  D  | 237.2 | 
 30/09/22 |  E  | 38.42 | 
 01/10/22 |  A  | 101.5 |
 01/10/22 |  B  | ----- | 
 01/10/22 |  C  | 237.6 | 
 01/10/22 |  D  | 232.2 | 
 01/10/22 |  E  | 38.54 | 

期望的结果:

   Date   |  A  |  B  |  C  |  D  |  E  |
 30/09/22 |100.5|151.3|233.4|237.2|38.42|
 01/10/22 |101.5|-----|237.6|232.2|38.54|

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    使用PIVOT:

    SELECT *
    FROM   table_name
    PIVOT (
      MAX(price) FOR stock IN ('A' AS a, 'B' AS b, 'C' AS c, 'D' AS d, 'E' AS e)
    )
    

    其中,对于您的样本数据:

    CREATE TABLE table_name ( "DATE", Stock, Price ) AS
      SELECT DATE '2022-09-30', 'A', 100.5  FROM DUAL UNION ALL
      SELECT DATE '2022-09-30', 'B', 151.3  FROM DUAL UNION ALL
      SELECT DATE '2022-09-30', 'C', 233.4  FROM DUAL UNION ALL
      SELECT DATE '2022-09-30', 'D', 237.2  FROM DUAL UNION ALL
      SELECT DATE '2022-09-30', 'E',  38.42 FROM DUAL UNION ALL
      SELECT DATE '2022-10-01', 'A', 101.5  FROM DUAL UNION ALL
      SELECT DATE '2022-10-01', 'B', NULL   FROM DUAL UNION ALL
      SELECT DATE '2022-10-01', 'C', 237.6  FROM DUAL UNION ALL
      SELECT DATE '2022-10-01', 'D', 232.2  FROM DUAL UNION ALL
      SELECT DATE '2022-10-01', 'E',  38.52 FROM DUAL;
    

    注意:DATE 是保留字,将其用作标识符是不好的做法。如果您必须将它用作标识符(不要),那么您将需要在将要使用它的任何地方使用带引号的标识符(大小写正确)。

    输出:

    DATE A B C D E
    2022-09-30 00:00:00 100.5 151.3 233.4 237.2 38.42
    2022-10-01 00:00:00 101.5 null 237.6 232.2 38.52

    fiddle

    【讨论】:

      【解决方案2】:

      您可以使用条件聚合方法来实现您想要的结果 -

      SELECT Date,
             MAX(CASE WHEN Stock = 'A' THEN Price END) AS A,
             MAX(CASE WHEN Stock = 'B' THEN Price END) AS B,
             MAX(CASE WHEN Stock = 'C' THEN Price END) AS C,
             MAX(CASE WHEN Stock = 'D' THEN Price END) AS D,
             MAX(CASE WHEN Stock = 'E' THEN Price END) AS E
        FROM DATA
       GROUP BY Date;
      

      另一个特定于 Oracle 的答案可能是 -

      SELECT *
        FROM DATA
       PIVOT(MAX(PRICE) FOR Stock IN ('A' AS A, 'B' AS B, 'C' AS C, 'D' AS D, 'E' AS E));
      

      Demo.

      【讨论】:

        猜你喜欢
        • 2021-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多