1

我的 SQL Server 2008 报告在一个表中返回了多行。一个简单的 select 语句返回两列,一列是记录号,另一列是扇区。扇区列可以包含 6 个不同值中的任何一个。

编辑:NULL扇区列中允许使用值。

我希望这些数据在我的表中的一行中。

假设记录 1 具有扇区 A、扇区 C 和扇区 E,记录 2 具有扇区 B 和扇区 C,而记录 3 没有扇区。

我在三行数据之后。我还需要它以两种方式显示。一种是让所有扇区出现在同一个单元格中,用逗号分隔。另一个是每个类别的单独单元格

Record number  | Sector
1              | A, C, E
2              | B, C
3              | 

或者

Record Number | Sector A | Sector B | Sector C | Sector D | Sector E
1             |  A       |          | C        |          | E
2             |          | B        | C        |          | 
3             |          |          |          |          | 

目前我的报告给了我 6 行。

Record Number | Sector
1             | A
1             | C
1             | E
2             | B
2             | C
3             | 

有没有办法解决这个问题?

我正在使用查询设计器而不是编写 SQL 语句。

4

1 回答 1

2

为了使用逗号分隔的sector值列表获得您想要的第一个结果,您需要使用FOR XML PATHand STUFF。代码将是:

select t1.recordnumber,
  STUFF((SELECT ', ' + t2.sector
         from yourtable t2
         where t1.recordnumber = t2.recordnumber
          FOR XML PATH (''))
          , 1, 1, '')  AS Sector
from yourtable t1
group by t1.recordnumber

请参阅SQL Fiddle with Demo。结果是:

| RECORDNUMBER |   SECTOR |
---------------------------
|            1 |  A, C, E |
|            2 |     B, C |
|            3 |   (null) |

然后要recordNumber在一行中获得结果,您可以使用该PIVOT函数:

select *
from
(
  select recordNumber, sector
  from yourtable
) src
pivot
(
  max(sector)
  for sector in (A, B, C, D, E)
) piv;

请参阅SQL Fiddle with Demo。这个查询的结果是:

| RECORDNUMBER |      A |      B |      C |      D |      E |
-------------------------------------------------------------
|            1 |      A | (null) |      C | (null) |      E |
|            2 | (null) |      B |      C | (null) | (null) |
|            3 | (null) | (null) | (null) | (null) | (null) |
于 2013-03-03T18:56:06.247 回答