sql - 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";
解决方案
您可以使用条件聚合来调整您的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
推荐阅读
- alexa - “否”触发 AMAZON.FallbackIntent 而不是 AMAZON.NoIntent
- javascript - 打字稿中的日期时间格式
- c# - 将框架从 3.5 更改为 4.0 时,Jquery ajax 调用不起作用
- google-sheets - 如何聚合工作表中特定唯一 ID 的所有值(Google 表格)
- robotframework - 如何解决机器人框架中的 urlopen 错误?
- objective-c - 向集合视图的选定单元格添加黑色边框,并从集合视图的其他未选定单元格中删除边框
- android - Gradle 项目同步失败。未解决的依赖关系
- math - 如何在 O(1) 运行时找到素数
- python - django中的MultiSelect不允许多项选择
- regex - 根据 reg 表达式对文件行进行排序