Oracle SQL - 组合来自多行的数据

时间:2016-07-15 13:56:35

标签: sql oracle

我有下表(顶行是标题):

+-------+------+-------+------+-------+----+----+----+
| 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返回三行,原因是最后3列中包含的值。 我想将每个给定ID的数据合并为一行。

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

所以我想回来:

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

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

  • 如果SW = 0,NUM列中的值SW = 1或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    |
+-------+------+-------+------+-------+------+------+------+

3 个答案:

答案 0 :(得分:0)

对于显示的样本数据,这应该有效。

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"

答案 1 :(得分:0)

首先,“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;

答案 2 :(得分:0)

这有效:

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