首页 > 解决方案 > SQL:按选定列对记录进行分组

问题描述

我的表看起来像这样(名称 = TMaster)

A B C D
1 1 1 X
1 1 1 Y
1 1 1 Z
2 2 2 Y
3 3 3 Y
3 3 3 Z

我想这样显示它:

A B C DX DY DZ
1 1 1 X  Y  Z
2 2 2    Y
3 3 3    Y  Z

我尝试过的解决方案:

我试图创建一个像这样的不同表:(名称 TUnique)

A B C
1 1 1
2 2 2
3 3 3

然后尝试使用其中一列(A 或 B 或 C)将其与原始表外部连接。但它返回如下输出:

A B C DX DY DZ
1 1 1 X  Y  Z

我也尝试过 Union 运算符,但没有运气。将“ ”作为创建的唯一表中的列,但最终会创建太多重复记录。

这是我尝试过的 SQL 代码:

SELECT
    Ta.A,
    Ta.B,
    Ta.C,
    Tm1.D,
    Tm2.D,
    Tm3.D
FROM
    TUnique Ta,
    TUnique Tb,
    TUnique Tc,
    TMaster Tm1,
    TMaster Tm2,
    TMaster Tm3
WHERE
    Tm1.A = Ta.A (+)
    AND Tm1.D="X"
    Tm2.A = Tb.A (+)
    AND Tm2.D="Y"
    Tm3.A = Tc.A (+)
    AND Tm3.D="X";

这也返回相同的记录。

SELECT
    Ta.A,
    Ta.B,
    Ta.C,
    Tm1.D,
    Tm2.D,
    Tm3.D
FROM
    TUnique Ta,
    TUnique Tb,
    TUnique Tc,
    TMaster Tm1,
    TMaster Tm2,
    TMaster Tm3
WHERE
    Tm1.A (+) = Ta.A 
    AND Tm1.D="X"
    Tm2.A (+) = Tb.A 
    AND Tm2.D="Y"
    Tm3.A (+) = Tc.A 
    AND Tm3.D="X";

标签: sqloraclepivot

解决方案


您可以使用条件聚合来调整您的D值:

SELECT A, B, C,
       MAX(CASE WHEN D='X' THEN D END) AS DX,
       MAX(CASE WHEN D='Y' THEN D END) AS DY,
       MAX(CASE WHEN D='Z' THEN D END) AS DZ
FROM TMaster
GROUP BY A, B, C

输出

A   B   C   DX      DY  DZ
1   1   1   X       Y   Z
2   2   2   null    Y   null
3   3   3   null    Y   Z

dbfiddle 上的演示


推荐阅读