2016-03-15 32 views
2

我有一個表稱爲產品,其顯示的數據如下:如何通過記錄組SQL服務器基於今年

--------------------------------- 
l TYPE l PERIOD l BALANCE l 
l Auto l 2015 l  5  l  
l Car l 2015 l  2  l  
l Bus l 2015 l  45  l 
l Auto l 2016 l  2  l  
l Car l 2016 l  6  l  
l Bus l 2016 l  50  l 
l Auto l 2017 l  12  l  
l Car l 2017 l  16  l  
l Bus l 2017 l  10  l 
--------------------------------- 

我需要查詢該表,以便結果是基於一年類似如下:

--------------------------------------------------------- 
l TYPE l BALANCE 2015 l BALANCE 2016 l BALANCE 2017 l 
l Auto l  5  l  2  l  12  l 
l Car l  2  l  6  l  16  l 
l Bus l  45  l  50  l  10  l 
--------------------------------------------------------- 

我試過不同的查詢,但沒有運氣。

您的幫助將是非常有用的,

在此先感謝。

+0

您可以在MS Sql Server中使用PIVOT –

+0

MySQL或MS SQL Server? (不同的產品,答案可能是產品特定的。) – jarlh

+0

如果突然插入2014行,它是否會以某種方式包含在結果中? – jarlh

回答

5

可以使用條件彙總如下:

SELECT t.type, 
     MAX(CASE WHEN period = 2015 then balance end) as BALANCE_2015, 
     MAX(CASE WHEN period = 2016 then balance end) as BALANCE_2016, 
     MAX(CASE WHEN period = 2017 then balance end) as BALANCE_2017 
FROM Product t 
GROUP BY t.type 

您可以添加更多的列取決於你要顯示的年。

+0

感謝您的查詢,但我不知道多少年的專欄「PERIOD」將有,所以我不能硬編碼查詢期間2015,2016,2017。是否可以修改此查詢以從表中動態選取所有年份? –

1
SELECT * 
FROM (
    SELECT period, type, balance 
    FROM dbo.Product 
) t 
PIVOT (
    MAX(balance) 
    FOR period IN ([2015], [2016], [2017]) 
) p 
1

您可以嘗試使用PIVOT

select [Type],[2015] as BALANCE2015,[2016] as BALANce2016,[2017] as BALANCe2017 from 
(
select [Type],[Period],[Balance] from my_table 
) as t 
pivot 
(
max([Balance]) for Period in ([2015],[2016],[2017]) 
) as pvt 
order by pvt.[Type] 
1

對於您的情況,因爲在「週期」是指可爲任意值的表列,硬編碼值以上方法都不是一個好理念。

您應該根據Period的值生成一個動態的PIVOT查詢。

簽出以下鏈接。

http://www.codeproject.com/Tips/1011591/Dynamic-Pivot-Query-in-SQL-Server

更新:

以下查詢你所需要的。

DECLARE @ColumnName AS VARCHAR(MAX) 
DECLARE @DynamicPivotQuery AS VARCHAR(MAX) = '' 

SELECT @ColumnName = COALESCE(@ColumnName + ',', '') + QUOTENAME(PERIOD) 
     FROM (SELECT DISTINCT PERIOD FROM Product) T; 

SET @DynamicPivotQuery = N'SELECT [TYPE], ' + @ColumnName + ' FROM Product ' + 
         ' PIVOT(SUM([BALANCE]) FOR PERIOD IN (' + @ColumnName + ')) AS PVTTable;'; 

EXEC (@DynamicPivotQuery) 

注:

我在PIVOT使用SUM作爲骨料的功能,你可以將其更改爲MAX或MIN按您的要求。