SQL - Unpivot/Pivot 行到列

SQL - Unpivot/Pivot Rows to Columns

使用 PL/SQL Developer,我试图基本上将一些行转为列,但我很难做到这一点。我认为解决方案是使用交叉应用然后取消透视,但也许我采用了错误的方式。

编辑:根据非常有用的评论,一个 ID 最多关联 5 行。

输入Table:

ID   Date       Location
111  1/05/2020  Cafe1
222  1/02/2020  Park1
222  1/11/2020  Cafe2

输出Table:

ID   Date1      Location1  Date2      Location2
111  1/05/2020  Cafe1   
222  1/02/2020  Park1      1/11/2020  Cafe2

代码尝试:

SELECT *
   FROM (
      SELECT A.ID
      ,B.*
      FROM MYTABLE as A
      CROSS APPLY (Date, Location)
          ) B(Item,Value)
      ) src
   PIVOT (max(value) for Item in ([Date], [Location])

不幸的是,我 运行 犯了一些严重的错误。任何 help/guidance 逆轴将不胜感激 - 请并谢谢!

您可能想要获得数据透视而不是反数据透视。

你可以尝试使用条件聚合函数做pivot

SELECT ID,
        MAX(CASE WHEN rn = 1 THEN Date END) 'Date1',
        MAX(CASE WHEN rn = 1 THEN Location END) 'Location1',
        MAX(CASE WHEN rn = 2 THEN Date END) 'Date2',
        MAX(CASE WHEN rn = 2 THEN Location END) 'Location2'
FROM (
    SELECT t1.*,
           ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Date) rn
    FROM MYTABLE t1 
) t1
GROUP BY ID

像这样:

with
  test_data (id, date_, location) as (
    select 111, to_date('1/05/2020', 'mm/dd/yyyy'), 'Cafe1' from dual union all
    select 222, to_date('1/02/2020', 'mm/dd/yyyy'), 'Park1' from dual union all
    select 222, to_date('1/11/2020', 'mm/dd/yyyy'), 'Cafe2' from dual
  )
-- end of test data (for illustration only); REMOVE the code above, and use your
-- actual table and column names below
select id, "1_DT" as date1, "1_LOC" as location1,
           "2_DT" as date2, "2_LOC" as location2,
           "3_DT" as date3, "3_LOC" as location3
from   ( select t.*, row_number() over (partition by id order by date_) as rn
         from   test_data t
       )
pivot  (min(date_) as dt, min(location) as loc for rn in (1, 2, 3))
;

  ID  DATE1       LOCATION1   DATE2       LOCATION2   DATE3       LOCATION3 
----  ----------  ----------  ----------  ----------  ----------  ----------
 111  01/05/2020  Cafe1                                                     
 222  01/02/2020  Park1       01/11/2020  Cafe2