12

是否可以在 SSRS 2008 中将 2 行合并为一行?每个部分都会有每个站点的记录

+---------------+-------+-------+
|Part Number    |Cost   |Site   |
+---------------+-------+-------+
|1              |2.4    |Site 1 |
|1              |68.8   |Site 2 |
+---------------+-------+-------+

期望的结果

+-----------+-------+-------+
|Part Number|Site 1 |Site 2 | 
+-----------+-------+-------+
| 1         |2.4    |68.8   |
+-----------+-------+-------+

谢谢

4

3 回答 3

15

如果您知道您的站点编号/名称不会动态更改,则可以使用CASE WHEN:s

SELECT PartNumber,
MAX(CASE WHEN Site=1 THEN Cost ELSE NULL END) AS Site1_Cost,
MAX(CASE WHEN Site=2 THEN Cost ELSE NULL END) AS Site2_Cost
FROM Parts
GROUP BY PartNumber

通过分组,我们消除了一个 NULL 值......

这里链接到 SQL Fiddle 示例

于 2013-03-26T11:09:32.863 回答
2

在 SSRS 中,您需要使用MATRIX报告将行转换为列而不使用PIVOT operator

假设你有一张桌子SSRSPivot

Create table SSRSPivot
(PartNumber int ,Cost decimal(18,2),Site varchar(max))


Insert into SSRSPivot
values
(1,2.4,'Site 1'),
(1,68.8,'Site 2' )

数据格式如下

+---------------+-------+-------+
|PartNumber    |Cost   |Site   |
+---------------+-------+-------+
|1              |2.4    |Site 1 |
|1              |68.8   |Site 2 |
+---------------+-------+-------+

创建一个新的空白报表并将其命名为。PIVOT创建一个数据源并在数据集中编写查询

  Select PartNumber ,Cost,Site from SSRSPivot

在此处输入图像描述

matrix工具箱中的 a 拖到 SSRS 设计器上。对于Rows选择PartNumber。对于列选择Site,对于数据选择Sum(Cost)

在此处输入图像描述

当您执行上述步骤时,您将获得如下所示的详细row信息column

在此处输入图像描述

最终结果看起来像

在此处输入图像描述

于 2013-03-26T12:05:40.790 回答
1

这种类型的数据转换称为PIVOT. 从 SQL Server 2005 开始,有一个函数可以为您将数据转换为列。

如果您有已知数量的Site要转换为列的值,则可以对查询进行硬编码:

select part_number, [Site 1], [Site 2]
from 
(
  select part_number, cost, site
  from yourtable
) src
pivot
(
  sum(cost)
  for site in ([Site 1], [Site 2])
) piv;

请参阅带有演示的 SQL Fiddle

但是如果您有未知数量的值,那么您将需要使用动态 SQL 来生成要在查询中使用的列列表:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(site) 
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT part_number,' + @cols + ' 
             from 
             (
                select part_number, cost, site
                from yourtable
            ) x
            pivot 
            (
                sum(cost)
                for site in (' + @cols + ')
            ) p '

execute(@query)

请参阅SQL Fiddle with Demo。两者都会给出结果:

| PART_NUMBER | SITE 1 | SITE 2 |
---------------------------------
|           1 |    2.4 |   68.8 |
于 2013-03-26T11:21:35.427 回答