Oracle SQL:将多列转置到行

Oracle SQL:将多列转置到行,sql,oracle,pivot,Sql,Oracle,Pivot,将多列转换为行时使用的最佳方法 鉴于: A B C D E F G FYQ1 11 10 8 6 1 0 0 FYQ2 11 10 8 7 2 0 0 FYQ3 11 11 11 10 5 4 0 FYQ4 11 11 11 10 5 4 0 所需: FYQ1 FYQ2 FYQ3 FYQ4 A

将多列转换为行时使用的最佳方法

鉴于:

            A    B  C   D   E   F   G 
    FYQ1    11  10  8   6   1   0   0
    FYQ2    11  10  8   7   2   0   0
    FYQ3    11  11  11  10  5   4   0
    FYQ4    11  11  11  10  5   4   0
所需:

        FYQ1 FYQ2 FYQ3 FYQ4
    A   11   11     11  11
    B   10   10     11  11
    C   8    8      11  11
    D   6    7      10  10
    E   1    2      5   5
    F   0    0      4   4
    G   0    0      0   0 

我看到你编辑了你的问题

您可以尝试将条件聚合函数与
UNION ALL

CREATE TABLE T(
   Name varchar(50),
   A int,
   B int,
   C int,
   D int,
   E int,
   F int,
   G int
);


INSERT INTO T VALUES ('FYQ1',11,10,8 ,6,1,0,0);
INSERT INTO T VALUES ('FYQ2',11,10,8 ,7,2,0,0);
INSERT INTO T VALUES ('FYQ3',11,11,11,10,5,4,0);
INSERT INTO T VALUES ('FYQ4',11,11,11,10,5,4,0);
查询1

SELECT 'A' as " ",
        MAX(CASE WHEN  NAME = 'FYQ1' THEN A END) FYQ1,
        MAX(CASE WHEN  NAME = 'FYQ2' THEN A END) FYQ2,
        MAX(CASE WHEN  NAME = 'FYQ3' THEN A END) FYQ3,
        MAX(CASE WHEN  NAME = 'FYQ4' THEN A END) FYQ4
FROM T
UNION ALL
SELECT 'C',
        MAX(CASE WHEN  NAME = 'FYQ1' THEN C END),
        MAX(CASE WHEN  NAME = 'FYQ2' THEN C END),
        MAX(CASE WHEN  NAME = 'FYQ3' THEN C END),
        MAX(CASE WHEN  NAME = 'FYQ4' THEN C END)
FROM T
UNION ALL
SELECT 'D',
        MAX(CASE WHEN  NAME = 'FYQ1' THEN D END),
        MAX(CASE WHEN  NAME = 'FYQ2' THEN D END),
        MAX(CASE WHEN  NAME = 'FYQ3' THEN D END),
        MAX(CASE WHEN  NAME = 'FYQ4' THEN D END)
FROM T
UNION ALL
SELECT 'E',
        MAX(CASE WHEN  NAME = 'FYQ1' THEN E END),
        MAX(CASE WHEN  NAME = 'FYQ2' THEN E END),
        MAX(CASE WHEN  NAME = 'FYQ3' THEN E END),
        MAX(CASE WHEN  NAME = 'FYQ4' THEN E END)
FROM T
UNION ALL
SELECT 'F',
        MAX(CASE WHEN  NAME = 'FYQ1' THEN F END),
        MAX(CASE WHEN  NAME = 'FYQ2' THEN F END),
        MAX(CASE WHEN  NAME = 'FYQ3' THEN F END),
        MAX(CASE WHEN  NAME = 'FYQ4' THEN F END)
FROM T
UNION ALL
SELECT 'G',
        MAX(CASE WHEN  NAME = 'FYQ1' THEN G END),
        MAX(CASE WHEN  NAME = 'FYQ2' THEN G END),
        MAX(CASE WHEN  NAME = 'FYQ3' THEN G END),
        MAX(CASE WHEN  NAME = 'FYQ4' THEN G END)
FROM T
|   | FYQ1 | FYQ2 | FYQ3 | FYQ4 |
|---|------|------|------|------|
| A |   11 |   11 |   11 |   11 |
| C |    8 |    8 |   11 |   11 |
| D |    6 |    7 |   10 |   10 |
| E |    1 |    2 |    5 |    5 |
| F |    0 |    0 |    4 |    4 |
| G |    0 |    0 |    0 |    0 |

SELECT 'A' as " ",
        MAX(CASE WHEN  NAME = 'FYQ1' THEN A END) FYQ1,
        MAX(CASE WHEN  NAME = 'FYQ2' THEN A END) FYQ2,
        MAX(CASE WHEN  NAME = 'FYQ3' THEN A END) FYQ3,
        MAX(CASE WHEN  NAME = 'FYQ4' THEN A END) FYQ4
FROM T
UNION ALL
SELECT 'C',
        MAX(CASE WHEN  NAME = 'FYQ1' THEN C END),
        MAX(CASE WHEN  NAME = 'FYQ2' THEN C END),
        MAX(CASE WHEN  NAME = 'FYQ3' THEN C END),
        MAX(CASE WHEN  NAME = 'FYQ4' THEN C END)
FROM T
UNION ALL
SELECT 'D',
        MAX(CASE WHEN  NAME = 'FYQ1' THEN D END),
        MAX(CASE WHEN  NAME = 'FYQ2' THEN D END),
        MAX(CASE WHEN  NAME = 'FYQ3' THEN D END),
        MAX(CASE WHEN  NAME = 'FYQ4' THEN D END)
FROM T
UNION ALL
SELECT 'E',
        MAX(CASE WHEN  NAME = 'FYQ1' THEN E END),
        MAX(CASE WHEN  NAME = 'FYQ2' THEN E END),
        MAX(CASE WHEN  NAME = 'FYQ3' THEN E END),
        MAX(CASE WHEN  NAME = 'FYQ4' THEN E END)
FROM T
UNION ALL
SELECT 'F',
        MAX(CASE WHEN  NAME = 'FYQ1' THEN F END),
        MAX(CASE WHEN  NAME = 'FYQ2' THEN F END),
        MAX(CASE WHEN  NAME = 'FYQ3' THEN F END),
        MAX(CASE WHEN  NAME = 'FYQ4' THEN F END)
FROM T
UNION ALL
SELECT 'G',
        MAX(CASE WHEN  NAME = 'FYQ1' THEN G END),
        MAX(CASE WHEN  NAME = 'FYQ2' THEN G END),
        MAX(CASE WHEN  NAME = 'FYQ3' THEN G END),
        MAX(CASE WHEN  NAME = 'FYQ4' THEN G END)
FROM T
|   | FYQ1 | FYQ2 | FYQ3 | FYQ4 |
|---|------|------|------|------|
| A |   11 |   11 |   11 |   11 |
| C |    8 |    8 |   11 |   11 |
| D |    6 |    7 |   10 |   10 |
| E |    1 |    2 |    5 |    5 |
| F |    0 |    0 |    4 |    4 |
| G |    0 |    0 |    0 |    0 |

为什么不想使用聚合函数呢?您使用的是什么版本的Oracle?12c,我们可以使用聚合吗??,我们可以使用WITH子句优化此版本吗??只需做一次所有的T表计算。