【发布时间】:2021-04-13 13:19:44
【问题描述】:
我是 SQL 世界的新手,我正在努力处理我的结果集...
我使用 2 个链接在一起的 CTE
- CTE A:选择 A、B、C、D、E、F、G、H、I、J、K(来自 8 个差异表)
- CTE B:选择 A、B、C、D、E、L(从 6 个差异表中;A 到 E 相同)
然后我尝试获取执行以下操作的结果表:
A,B,C, 1st,2nd,3d
-> A-D:确定我们正在谈论的特定项目的识别列
1st、2nd 和 3d 取决于 CTE 中的值
我的查询如下:
select A.A, A.B,A.C,A.D,
case
when EXISTS(select B.E from B join on A on xxx and B.E= 030) then (select B.E from B join on A on xxx and B.E= 030)
else A.H
end as "1st",
case
when EXISTS (select B.E from B join on A on xxx and B.E= 031) then B.E
when NOT EXISTS (select B.E from B join on A on xxx and B.E= 030) then A.K
else A.H
end as "2nd",
case
when EXISTS (select B.E from B join on A on xxx and B.E= 031) then A.H
else A.K
end as "3d"
from A
额外信息:
- B.E = 031 不能没有 B.E = 030 存在
- 在 CTE-A G-K 中可以为空;在 CTE-B 中不存在空值
- 如果 B.E = 030 和 B.E = 031 都存在,则 A.I、A.J 和 A.K 为空
我的结果集中的问题: 我明白了
A | B | C | D | 1st | 2nd | 3d |
a | b | c | d | x | null| null|
a | b | c | d | null| y | null|
a | b | c | d | null| null| z |
我希望在同一行中获得相同 A-D 的这些结果。 GROUP BY 不起作用,因为我没有聚合函数。 如果我也包括 A.E,我会看到每一行都有不同的值,例如:
A | B | C | D | E | 1st | 2nd | 3d |
a | b | c | d | 030| x | null| null|
a | b | c | d | 031| null| y | null|
a | b | c | d | 100| null| null| z |
关于如何让它返回单行的任何想法?
编辑:
- 为什么是 2 个 CTE:我已经多次编写和重写此查询,结果是这样。 我尝试了使用不同层、1 个 CTE 和不同类型的连接(左、内)的子查询,但结果都与此相同。
- 我尝试了 GROUP BY,因为这是我知道的唯一聚合行的方法
CTE A 返回:
ITEM | NAME | SUB | SUB2 | NR | F | G | H | I | J | K
ItemA |testname | 0101 |sub2test | 100|GRa |GR | val1 | GRb| GR | Val2
ItemB |testname2| Z101 |sub2test2| 100|FRa |FR | val3 |null| null | null
ItemC |testname3| D401 |sub2test3| 100|Daa |Dx | val5 |null| null | null
CTE B 返回:
ITEM | NAME | SUB | SUB2 | NR | L
ItemB |testname2| Z101 |sub2test2 | 30 | textL
ItemB |testname2| Z101 |sub2test2 | 31 | textK
结果,这将给出
ITEM | NAME | SUB |SUB2 | 1st | 2nd | 3d
ItemA |testname | 0101 |sub2test |val1 | val2| null
ItemB |testname2 | Z101 |sub2test2|textL|null | null
ItemB |testname2 | Z101 |sub2test2|null |textK|val3
ItemC |testname3 | D401 |sub2test3|val5 |null | null
对于 ItemB,我希望它位于 1 行
【问题讨论】:
-
这非常令人困惑...在这里我恳请您进行一些编辑,请在表名和列名之间使用不同的名称,至少将表命名为:tbA、tbB 或名称列,例如:colA, colB.
-
您使用哪个数据库? SQL 是一种语言,TOAD 是一种工具。
-
您的问题完全不清楚。请提供minimal reproducible example。 GROUP BY 不起作用,因为我没有聚合函数 - 当然,在您明确添加一些聚合之前,DBMS 不会为您聚合。但是为什么你没有呢?
-
我对这两个 CTE 的用途一无所知。该问题特别指出:“我们谈论的第 1、第 2 和第 3d 取决于在 CTE 中找到的值”。我会得到的。一个 CTE,但两个与问题有什么关系?