使用数据透视表

时间:2017-02-15 08:38:22

标签: sql stored-procedures pivot-table sql-server-2014

这是我的存储过程查询,用于获取第一个表中的数据。

SELECT [Item] = t3.Item,
[Name] = t2.Name,
[Value] = t1.value

INTO #Result

FROM table1 t1
INNER JOIN table2 t2 ON t2.IsDeleted = 0
INNER JOIN table3 t3 ON t3.IsDeleted = 0 AND t3.Item_ID = @Id
WHERE t1.Item_ID = @Id 

GROUP BY 
t1.value,
t2.Name,
t3.Item

我在临时表中有以下数据。

|  Item |  Name  | Value |
--------------------------
| item1 | Name 1 |   2   |
| item2 | Name 1 |   4   |
| item3 | Name 1 |   5   |
| item1 | Name 2 |   6   |
| item2 | Name 2 |   3   |
| item3 | Name 2 |   1   |
| item1 | Name 3 |   7   |
| item2 | Name 3 |   4   |
| item3 | Name 3 |   2   |

我希望将名称1,名称2,名称3作为列,将value作为相应的项目。表格中的数据是动态的。可以是任意数量的Items和任意数量的{{ 1}}。对于每NameName,它们的值可以是一位数。每Item谢谢

Items都相同

我需要下面的内容。

Name

2 个答案:

答案 0 :(得分:0)

使用pivot

declare @T table
(
    item varchar(5),
    name varchar(6),
    value smallint
)

insert into @T
select 'item1' , 'Name 1' , 2 union
select 'item2' , 'Name 1' , 4 union
select 'item3' , 'Name 1' , 5 union
select 'item1' , 'Name 2' , 6 union
select 'item2' , 'Name 2' , 3 union
select 'item3' , 'Name 2' , 1 union
select 'item1' , 'Name 3' , 7 union
select 'item2' , 'Name 3' , 4 union
select 'item3' , 'Name 3' , 2 

select * 
from
(
    select * from @T
) p
pivot
(
    sum(value) for name in ([Name 1], [Name 2], [Name 3])
) pvt

如果你的名字不是常数而且可能不同,你应该创建动态的sql查询(here你可以找到一个动态查询的例子。)

答案 1 :(得分:0)

这对我有用。 :)

IF OBJECT_ID('TEMPDB.dbo.##FinalResult ') IS NOT NULL DROP TABLE ##FinalResult 

DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)

--Get distinct values of the PIVOT Column 
SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
       + QUOTENAME([Name])     
FROM (SELECT DISTINCT [Name] FROM #Result) AS ##FinalResult 

--Prepare the PIVOT query using the dynamic 
SET @DynamicPivotQuery = 
  N'SELECT [Item], ' + @ColumnName + '
    INTO ##FinalResult 
    FROM #Result 
    PIVOT(MAX([Value])
    FOR [Name] IN (' + @ColumnName + ')) AS PVTTable'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery

SELECT * FROM ##FinalResult