2016-03-15 86 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按您的要求。