[英]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,依此类推。
所以我想返回:
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.