2013-01-16 44 views
0

我使用MS SQL Server 2008 R2和有一组数据是这样的:SQL重新组织表SSRS显示

LocaId Location StaffId 
1  Main St 1 
2  South Ave 1 
3  South Ave 2 
4  2nd St 1 
5  2nd St 2 
6  Lewis Ave 1 

我想在头使用方式和地点的SSRS报告中显示的数据。

  John  Mark 
Location Main St South Ave 
Location South Ave 22nd St 
Location 22nd St Null 
Location Lewis Ave Null 

但与下面的代码:

SELECT 'Location', 
(CASE WHEN l.StaffId = 1 THEN l.Location ELSE NULL END) AS 'John', 
(CASE WHEN l.StaffId = 2 THEN l.Location ELSE NULL END) AS 'Mark' 
FROM Location l 

我得到下面的结果。这似乎很容易正确显示数据,但我没有得到我需要在报告中显示的结果。

  John  Mark 
-------- ----------- --------- 
Location Main St  NULL 
Location South Ave NULL 
Location 22nd St  NULL 
Location Lewis Ave NULL 
Location NULL  Main St 
Location NULL  South Ave 

回答

2

只需添加一个聚合函数:如果你想null值出现在列表的底部

SELECT l.location, 
MAX(CASE WHEN l.StaffId = 1 THEN l.Location ELSE NULL END) AS 'John', 
MAX(CASE WHEN l.StaffId = 2 THEN l.Location ELSE NULL END) AS 'Mark' 
FROM Location l 
GROUP BY l.location 
+0

谢谢你,我一直认为是总数字和不文本数据。 –

1

,那么你可以使用:

SELECT 'Location', 
    MAX(CASE WHEN l.StaffId = 1 THEN l.Location ELSE NULL END) AS 'John', 
    MAX(CASE WHEN l.StaffId = 2 THEN l.Location ELSE NULL END) AS 'Mark' 
FROM 
(
    select StaffId, location, 
    row_number() over(partition by StaffId order by locaid) rn 
    from Location 
) l 
GROUP BY rn 

SQL Fiddle with Demo

您还可以使用PIVOT函数来tra nsform数据:

select 'Location', 
    [1] as 'John', 
    [2] as 'Mark' 
from 
(
    select staffid, location, 
    row_number() over(partition by StaffId order by locaid) rn 
    from location 
) src 
pivot 
(
    max(location) 
    for staffid in ([1], [2]) 
) piv 

SQL Fiddle with Demo

结果是:

| COLUMN_0 |  JOHN |  MARK | 
------------------------------------ 
| Location | Main St | South Ave | 
| Location | South Ave | 2nd St | 
| Location | 2nd St | (null) | 
| Location | Lewis Ave | (null) |