【问题标题】:Sql how to return multiple rows as one rowsql如何将多行作为一行返回
【发布时间】: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 exampleGROUP BY 不起作用,因为我没有聚合函数 - 当然,在您明确添加一些聚合之前,DBMS 不会为您聚合。但是为什么你没有呢?
  • 我对这两个 CTE 的用途一无所知。该问题特别指出:“我们谈论的第 1、第 2 和第 3d 取决于在 CTE 中找到的值”。我会得到的。一个 CTE,但两个与问题有什么关系?

标签: sql oracle


【解决方案1】:

如何使用GROUP BYLISTAGG

类似的东西

SELECT 
    ITEM, NAME, SUB, SUB2,
    LISTAGG(1ST) WITHIN GROUP (ORDER BY 1ST) AS 1ST,
    LISTAGG(2ND) WITHIN GROUP (ORDER BY 2ND) AS 2ND,
    LISTAGG(3RD) WITHIN GROUP (ORDER BY 3RD) AS 3RD
FROM yourCteResult
GROUP BY ITEM, NAME, SUB, SUB2

【讨论】:

    猜你喜欢
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    相关资源
    最近更新 更多