SQL Server将2行合并为1

时间:2013-03-26 10:51:33

标签: sql sql-server sql-server-2008 pivot

是否可以在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   |
+-----------+-------+-------+

谢谢

3 个答案:

答案 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

enter image description here

matrix从工具箱拖到SSRS设计器上。对于Rows选择PartNumber。对于列选择Site,对于数据选择Sum(Cost) < / p>

enter image description here

执行上述步骤后,您将获得rowcolumn详细信息,如下所示

enter image description here

最终结果将如下所示

enter image description here

答案 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 Fiddle with Demo

但是如果你有一个未知数量的值,那么你需要使用动态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 |