2017-02-15 72 views
0

这是我的存储过程查询以获取第一个表中的数据。使用数据透视表将重复的行值隐藏到列中

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靠在相应item.Data在表是dynamic.There可以是任何数量的Items和任何数量的Name。对于每个NameItem,它们是可以是单个数字的值。 Items是相同的每Name谢谢

我需要像下面的东西。

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

为什么存储过程标记? – jarlh

+0

GROUP BY可以使用。将使用所有的dbms产品。 – jarlh

+0

因为我需要在存储过程中使用它。如果你想我可以发布我的存储过程。 –

回答

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 
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你可以找到动态查询的例子)。

相关问题