繁体   English   中英

Oracle SQL-合并多行数据

[英]Oracle SQL - combine data from several rows

我有下表(第一行是标题):

+-------+------+-------+------+-------+----+----+----+
| ID    | GRP  | DESC  | DEN  | NUM   | SU | CS | SW |
+-------+------+-------+------+-------+----+----+----+
| 12345 | MANX | Mango | 1    | 10    | 0  | 0  | 1  |
+-------+------+-------+------+-------+----+----+----+
| 12345 | MANX | Mango | 1    | 200   | 0  | 1  | 0  |
+-------+------+-------+------+-------+----+----+----+
| 12345 | MANX | Mango | 2667 | 10000 | 1  | 0  | 0  |
+-------+------+-------+------+-------+----+----+----+

我正在努力实现以下目标:

+-------+------+-------+------+-------+----+-----+----+
| ID    | GRP  | DESC  | DEN  | NUM   | SU | CS  | SW |
+-------+------+-------+------+-------+----+-----+----+
| 12345 | MANX | Mango | 2667 | 10000 | 1  | 200 | 10 |
+-------+------+-------+------+-------+----+-----+----+

每个ID返回三行,原因是最后三列中包含的值。 我想将每个给定ID的数据合并为一行。

SU,CS和SW不能在同一行上都具有1。如果SU为1,则CS和SW始终为0。如果CS为1,则SU和SW始终为0,依此类推。

所以我想返回:

  • 前3列,后跟
  • DEN和NUM列中的值,其中SU = 1,后跟SU列中的值

  • CS = 1的行的NUM列中的值,后跟

  • NUM列中的值,其中SW = 1;如果SW = 0,则为0

我尝试谷歌搜索前进的道路,发现提到了自我加入。 我已经尝试过了,也许由于我的理解有限,我无法使其正常工作。 我得到了更多的数据行!

在此我将不胜感激。

干杯

更新 -@vkp代码的结果

+-------+------+-------+------+-------+------+------+------+
| ID    | GRP  | DESC  | DEN  | NUM   | SU   | CS   | SW   |
+-------+------+-------+------+-------+------+------+------+
| 12345 | MANX | Mango | 2667 | 10000 | 1    | null | null |
+-------+------+-------+------+-------+------+------+------+
| 12345 | MANX | Mango | null | null  | null | 200  | 0    |
+-------+------+-------+------+-------+------+------+------+
| 12345 | MANX | Mango | null | null  | null | null | 1    |
+-------+------+-------+------+-------+------+------+------+

对于所示的示例数据,这应该可以工作。

select id, grp, "desc", 
max(case when su = 1 then den end) den,
max(case when su = 1 then num end) num,
max(case when su = 1 then su end) su,
max(case when cs = 1 then num end) cs,
max(case when sw = 1 then num when sw = 0 then 0 end) sw
from tablename
group by id,grp,"desc"

首先,“ desc”不是一个聪明的列名。

我将联接同一张表3次,然后从适当的联接中选择值。 参见以下示例(我假设id是某种唯一键):

create table tab
( id      number(12)
, grp     varchar2(4)
, "desc"  varchar2(40)
, den     number(12)
, num     number(12)
, su      number(12)
, cs      number(12)
, sw      number(12)
);

insert into tab values ( 12345 ,'MANX','Mango', 1    , 10    , 0  , 0  , 1  );
insert into tab values ( 12345 ,'MANX','Mango', 1    , 200   , 0  , 1  , 0  );
insert into tab values ( 12345 ,'MANX','Mango', 2667 , 10000 , 1  , 0  , 0  );

select tab_su.id
,      tab_su.grp
,      tab_su."desc"
,      tab_su.den
,      tab_su.num
,      tab_cs.num as cs
,      tab_sw.num as sw
from   tab tab_su
,      tab tab_cs
,      tab tab_sw
where  tab_su.su = 1
and    tab_cs.cs = 1
and    tab_sw.sw = 1
and    tab_su.id = tab_cs.id
and    tab_su.id = tab_sw.id;

这工作:

select id,grp,itdesc,
 MAX(CASE WHEN su=1 or cs =1 THEN DEN END) AS DEN,
 MAX(CASE WHEN su=1 or cs =1 THEN NUM END) AS NUM,
 MAX(CASE WHEN su=1 THEN SU END) AS SU ,  -- or just  "1 AS SU" 
 MAX(CASE WHEN cs=1 THEN NUM END) AS CS,
 MAX(CASE 
   WHEN sw=1 THEN NUM  
   WHEN sw=0 THEN 0 
 END) AS SW
FROM tab
GROUP BY id,grp,itdesc

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM