如何在两列上旋转

问题描述 投票:-1回答:1
date       |  shop | rank_1 | rank2
-----------+-------+--------+------
01.01.2020 |   ZZZ |      1 |     3
01.01.2020 |   YYY |      2 |     4
01.01.2020 |   DDD |      3 |     5
01.01.2020 |   UUU |      4 |     1
01.01.2020 | LLLLL |      5 |     2

表看起来像这样,我想进行转换,因此看起来像这样:

date       | rank_1_1 | rank_1_2 | rank_1_3 | rank_1_4 | rank_1_5 | ...
-----------+----------+----------+----------+----------+----------+------
01.01.2020 |      ZZZ |      YYY |      DDD |      UUU |    LLLLL | ...
sql oracle
1个回答
1
投票

枢轴允许您连续显示列数据。您想将2列转换为行,这比较麻烦。我为每个子查询添加了一条注释,以解释我的工作。了解它的最好方法是将其再次撕开并检查会发生什么。

WITH /* sample data */
mydata (thedate, shop, rank_1, rank_2) AS
(
  SELECT DATE'2020-01-01', 'ZZZ', 1, 3 FROM DUAL
  UNION
  SELECT DATE'2020-01-01', 'YYY', 2, 4 FROM DUAL
  UNION  
  SELECT DATE'2020-01-01', 'DDD', 3, 5 FROM DUAL
  UNION  
  SELECT DATE'2020-01-01', 'UUU', 4, 1 FROM DUAL
  UNION  
  SELECT DATE'2020-01-01', 'LLLLL', 5, 2 FROM DUAL
  UNION  
  SELECT DATE'2020-01-02', 'AAA', 5, 2 FROM DUAL
), 
/* extract only first column */
my_data_rank1 (thedate, shop, rank_1)
AS
(
SELECT thedate,
       shop,
       rank_1
  FROM mydata
),
/* extract only 2nd column */
my_data_rank2 (thedate, shop, rank_2)
AS
(
SELECT thedate,
       shop,
       rank_2
  FROM mydata
),
/* pivot on 1st column */
rank1_pivot_data AS
(
SELECT * FROM my_data_rank1  
PIVOT (MAX(shop) for rank_1 IN ('1' rank_1_1, '2' rank_1_2, '3' rank_1_3 , '4' rank_1_4 , '5' rank_1_5 ))
),
/* pivot on 2nd column */
 rank2_pivot_data AS
(
SELECT * FROM my_data_rank2  
PIVOT (MAX(shop) for rank_2 IN ('1' rank_2_1, '2' rank_2_2, '3' rank_2_3 , '4' rank_2_4 , '5' rank_2_5 ))
),
/* combine both rows. this will give you 2 rows: one for rank_1 and one for rank_2 */
combined_data (thedate, rank_1_1,rank_1_2,rank_1_3,rank_1_4,rank_1_5,rank_2_1,rank_2_2,rank_2_3,rank_2_4,rank_2_5) AS
(
 SELECT thedate, rank_1_1,rank_1_2,rank_1_3,rank_1_4,rank_1_5,null,null,null,null,null
   FROM rank1_pivot_data
 UNION ALL
 SELECT thedate, null,null,null,null,null,rank_2_1,rank_2_2,rank_2_3,rank_2_4,rank_2_5
   FROM rank2_pivot_data
),
/* merge the rows into 1 */
combined_data_merged  (thedate, rank_1_1,rank_1_2,rank_1_3,rank_1_4,rank_1_5,rank_2_1,rank_2_2,rank_2_3,rank_2_4,rank_2_5) 
AS 
(
 SELECT thedate, MAX(rank_1_1),MAX(rank_1_2),MAX(rank_1_3),MAX(rank_1_4),MAX(rank_1_5),MAX(rank_2_1),MAX(rank_2_2),MAX(rank_2_3),MAX(rank_2_4),MAX(rank_2_5)
   FROM combined_data
   GROUP BY thedate
)
SELECT * FROM combined_data_merged;


THEDATE     RANK_ RANK_ RANK_ RANK_ RANK_ RANK_ RANK_ RANK_ RANK_ RANK_
----------- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----
01-JAN-2020 ZZZ   YYY   DDD   UUU   LLLLL UUU   LLLLL ZZZ   YYY   DDD  
02-JAN-2020                         AAA         AAA                    
© www.soinside.com 2019 - 2024. All rights reserved.