嗨朋友我对sql server有点疑问请告诉我如何解决这个问题
表数据如下所示 表:EMP
id , name, sal B , abc, 100 A , abc, -30 p , abc, -40 s , abc, -20 T , abc , -10 B ,def , 200 A ,def , -90 p ,def , -10 s , def , -50 T ,def , -50
基于该表数据我希望输出如下
id ,name , Toalamount(B) , adjust(A) ,payed(p) ,self(S) ,trans(T) B ,abc , 100 , 0 ,0 ,0 ,0 A ,abc , 0 ,-30 ,0 ,0 ,0 p ,abc , 0 ,0 ,-40 ,0 ,0 s ,abc , 0 ,0 ,0 ,-20 ,0 T ,abc , 0 ,0 ,0 ,0 ,-10 B ,def , 200 ,0 ,0 ,0 ,0 A ,def , 0 ,-90 ,0 ,0 ,0 p ,def ,0 ,0 ,-50 ,0 ,0 s ,def ,0 ,0 ,0 ,-50 ,0 T ,def ,0 ,0 ,0 ,0 ,-50
请告诉我如何在sql server中使用查询获取所需的输出。
答案 0 :(得分:1)
如果我理解你想要这样的查询
SELECT id, [name],
CASE id
WHEN 'B' THEN sal
ELSE 0
END AS Toalamount,
CASE id
WHEN 'A' THEN (SELECT sal FROM TABLENAME WHERE id='A' AND [name] = t.name)
ELSE 0
END AS adjust,
CASE id
WHEN 'P' THEN (SELECT sal FROM TABLENAME WHERE id='P' AND [name] = t.name)
ELSE 0
END AS payed,
CASE id
WHEN 'S' THEN (SELECT sal FROM TABLENAME WHERE id='S' AND [name] = t.name)
ELSE 0
END AS self,
CASE id
WHEN 'T' THEN (SELECT sal FROM TABLENAME WHERE id='T' AND [name] = t.name)
ELSE 0
END AS trans
FROM TABLENAME T
答案 1 :(得分:1)
奇怪的请求,但是你去了:
declare @t table(id char(1), name char(3), sal int)
insert @t
values('B' , 'abc', 100),('A' ,'abc', -30),('p' ,'abc', -40),('s' ,'abc', -20),
('T' ,'abc', -10),('B' ,'def', 200),('A' ,'def', -90),('p' ,'def', -10),
('s' ,'def', -50),('T' ,'def', -50)
;with x as
(
select row_number() over (order by (select 1)) rn, id as id2, * from @t
)
select id, name,
coalesce([B], 0) as [Toalamount(B)],
coalesce([A],0) as [adjust(A)],
coalesce([p],0) as [payed(p)],
coalesce([s],0) as [self(S)],
coalesce([T],0) as [trans(T)]
from x
PIVOT (SUM(sal) FOR [id2] IN ([B],[A], [p], [s],[T])) AS pvt
描述的结果:
id name Toalamount(B) adjust(A) payed(p) self(S) trans(T)
B abc 100 0 0 0 0
A abc 0 -30 0 0 0
p abc 0 0 -40 0 0
s abc 0 0 0 -20 0
T abc 0 0 0 0 -10
B def 200 0 0 0 0
A def 0 -90 0 0 0
p def 0 0 -10 0 0
s def 0 0 0 -50 0
T def 0 0 0 0 -50
请考虑以下内容:
select name,
coalesce([B], 0) as [Toalamount(B)],
coalesce([A],0) as [adjust(A)],
coalesce([p],0) as [payed(p)],
coalesce([s],0) as [self(S)],
coalesce([T],0) as [trans(T)]
from @t -- same test table
PIVOT (SUM(sal) FOR [id] IN ([B],[A], [p], [s],[T])) AS pvt
name Toalamount(B) adjust(A) payed(p) self(S) trans(T)
abc 100 -30 -40 -20 -10
def 200 -90 -10 -50 -50