是否可以在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 |
+-----------+-------+-------+
谢谢
答案 0 :(得分:13)
如果您知道您的网站编号/名称不会动态更改,则可以使用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值......
这里link带有SQL Fiddle示例
答案 1 :(得分: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
从工具箱拖到SSRS设计器上。对于Rows
选择PartNumber
。对于列选择Site
,对于数据选择Sum(Cost)
< / p>
执行上述步骤后,您将获得row
和column
详细信息,如下所示
最终结果将如下所示
答案 2 :(得分: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来生成要在查询中使用的列列表:
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 |