sql server 2008需要查询

时间:2014-03-21 07:52:01

标签: sql-server sql-server-2008

嗨朋友我对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中使用查询获取所需的输出。

  • 列表项

2 个答案:

答案 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