【问题标题】:Combining two tables with a PIVOT statement - SQL Oracle 11g使用 PIVOT 语句组合两个表 - SQL Oracle 11g
【发布时间】:2022-01-15 04:07:07
【问题描述】:

我有一个这样的表,叫做 DWH_DATA:

DATETIME         FK_FEDERAL_STATE     FK_ACCOMODATION   ARRIVALS   NIGHTS
--------------- --------------------  --------------- ----------  ----------
200010               W96-7              61              2433       16111
200011               W96-9              86              3718       30319
200012               W96-3              87              1100        8487
200101               W96-2              998             239         1038

附加信息日期时间 = 前四个数字 = 年份 + 后两个数字 = 月份

然后我有一个表 DWH_FEDERAL_STATES:

CODE(PK)         NAME                   
---------- -------------------
 W96-2      Country 2
 W96-3      Country 3              
 W96-9      Country 9    
 W96-7      Country 7  

现在我想为每个联邦州获得所有夜晚。结果应如下所示:

       Country 2  Country 3  Country 9  Country 7
200010    6979                              16111
200011    ..
200012    ..
200101    ..

我已经尝试过的是 PIVOT 语句:

  SELECT * FROM   
(
    SELECT 
        DATETIME, 
        NIGHTS,
        dwh_data.fk_federal_state As federalState
    FROM 
        dwh_data JOIN DWH_FEDERAL_STATES
         ON dwh_data.fk_federal_state = dwh_federal_states.code
) t 
PIVOT(
    COUNT(federalState) 
    FOR federalState IN ('Country 2','Country 3','Country 9')
      
       
) ORDER BY 1;

我得到的结果是:

DATETIME                 NIGHTS 'Country 2' 'Country 3' 'Country 9'
-------------------- ---------- ----------- ----------- -----------
197707                    83648           0           0           0
197707                    87301           0           0           0
197707                    97350           0           0           0

【问题讨论】:

    标签: sql oracle11g


    【解决方案1】:

    您不想COUNT,您想SUM 晚上并使用name 列:

    SELECT datetime,
           COALESCE(country_2, 0) AS country_2,
           COALESCE(country_3, 0) AS country_3,
           COALESCE(country_9, 0) AS country_9
    FROM   (
      SELECT d.DATETIME,
             nights,
             f.name
      FROM   dwh_data d
             JOIN DWH_FEDERAL_STATES f
             ON d.fk_federal_state = f.code
    )
    PIVOT(
      SUM(nights) 
      FOR name IN (
        'Country 2' AS country_2,
        'Country 3' AS country_3,
        'Country 9' AS country_9
      )
    )
    ORDER BY
           datetime;
    

    其中,对于样本数据:

    CREATE TABLE dwh_data (DATETIME, FK_FEDERAL_STATE, FK_ACCOMODATION, ARRIVALS, NIGHTS) AS
    SELECT 200010, 'W96-7',  61, 2433, 16111 FROM DUAL UNION ALL
    SELECT 200011, 'W96-9',  86, 3718, 30319 FROM DUAL UNION ALL
    SELECT 200012, 'W96-3',  87, 1100,  8487 FROM DUAL UNION ALL
    SELECT 200101, 'W96-2', 998,  239,  1038 FROM DUAL;
    
    CREATE TABLE DWH_FEDERAL_STATES (CODE, NAME) AS
    SELECT 'W96-2', 'Country 2' FROM DUAL UNION ALL
    SELECT 'W96-3', 'Country 3' FROM DUAL UNION ALL              
    SELECT 'W96-9', 'Country 9' FROM DUAL UNION ALL
    SELECT 'W96-7', 'Country 7' FROM DUAL;
    

    输出:

    DATETIME COUNTRY_2 COUNTRY_3 COUNTRY_9
    200010 0 0 0
    200011 0 0 30319
    200012 0 8487 0
    200101 1038 0 0

    db小提琴here

    【讨论】:

    • 是的,我试过了,但是国家列中的值到处都是 0
    • 在国家栏目中应该有夜晚
    • @saja 添加了一个 dbfiddle。并非所有内容都是0。您需要调试并找出小提琴和您的代码之间的不同之处。
    • 是的,但值不正确。所以不是一切都是0,但一切都是错的
    • @saja 为什么在查询中使用COUNT?您不想计算行数。更新为使用SUM
    猜你喜欢
    • 2018-07-09
    • 1970-01-01
    • 2020-03-27
    • 2012-08-28
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    相关资源
    最近更新 更多