2017-02-15 78 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你可以找到動態查詢的例子)。

相關問題