0

我正在使用 MS SQL Server 2008 R2 并拥有一组数据:

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
4

2 回答 2

2

只需添加一个聚合函数:

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
于 2013-01-16T19:00:27.303 回答
1

如果您希望null值显示在列表底部,则可以使用:

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

您还可以使用该PIVOT函数来转换数据:

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

结果是:

| COLUMN_0 |      JOHN |      MARK |
------------------------------------
| Location |   Main St | South Ave |
| Location | South Ave |    2nd St |
| Location |    2nd St |    (null) |
| Location | Lewis Ave |    (null) |
于 2013-01-16T19:05:59.907 回答