我有下表(顶行是标题):
+-------+------+-------+------+-------+----+----+----+
| 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,依此类推。
所以我想回来:
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 |
+-------+------+-------+------+-------+------+------+------+
答案 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