Sql如何将多行作为一行返回

Sql如何将多行作为一行返回,sql,oracle,Sql,Oracle,我是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、1、2、3d ->A-D:确定我们谈论的具体项目的识别列 1、2和3取决于CTE中的值 我的质询如下: select A.A, A.B,A.C,A.D, case when EXISTS(se

我是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、1、2、3d

->A-D:确定我们谈论的具体项目的识别列

1、2和3取决于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=030,B.E=031不可能存在
  • 在CTE-A中,G-K可以为空;在CTE-B中不存在空值
  • 如果B.E=030和B.E=031都存在,则A.I、A.J和A.K为空
我的结果集中的问题是: 我明白了

我想在同一行上获得相同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和不同类型的联接(左、内)进行子查询,但结果都与此相同
  • 我尝试了分组方式,因为这是我知道的聚合行的唯一方法
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,我希望它位于一行

使用
groupby
listag
怎么样

类似于

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

这是非常令人困惑的。。。在这里,我恳请一些编辑,请使用不同的名称之间的表和列名,至少名称表像:tbA,tbB或名称列像:可乐,colB。你使用哪个数据库?SQL是一种语言,TOAD是一种工具。你的问题完全不清楚。请提供。GROUPBY不起作用,因为我没有聚合函数——当然,在您显式添加一些聚合之前,DBMS不会为您聚合。但是为什么你没有呢?我不知道这两个CTE是干什么用的。问题明确地说:“我们谈论的是1、2和3d取决于CTE中的值。”。我会得到的。一个CTE,但两个CTE与问题有什么关系?
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