I am using MS SQL SERVER 2008 and I have following data:
select * from account; | PERIOD | ACCOUNT | VALUE | ---------------------------- | 2000 | Asset | 205 | | 2000 | Equity | 365 | | 2000 | Profit | 524 | | 2001 | Asset | 142 | | 2001 | Equity | 214 | | 2001 | Profit | 421 | | 2002 | Asset | 421 | | 2002 | Equity | 163 | | 2002 | Profit | 325 |
I want to make them to be this:
| ACCOUNT | 2000 | 2001 | 2002 | -------------------------------- | Asset | 205 | 142 | 421 | | Equity | 365 | 214 | 163 | | Profit | 524 | 421 | 325 |
I've tried to query use pivot query
but the value have to use aggregate function
and the result is not appropriate. what should I do?
The answer is no: PIVOT requires aggregation.
SELECT * FROM ( SELECT [Period], [Account], [Value] FROM TableName ) AS source PIVOT ( MAX([Value]) FOR [Period] IN ([2000], [2001], [2002]) ) as pvt
Another way,
SELECT ACCOUNT, MAX(CASE WHEN Period = '2000' THEN Value ELSE NULL END) [2000], MAX(CASE WHEN Period = '2001' THEN Value ELSE NULL END) [2001], MAX(CASE WHEN Period = '2002' THEN Value ELSE NULL END) [2002] FROM tableName GROUP BY Account
Check this out as well: using xml path
and pivot
SQLFIDDLE DEMO
| ACCOUNT | 2000 | 2001 | 2002 | -------------------------------- | Asset | 205 | 142 | 421 | | Equity | 365 | 214 | 163 | | Profit | 524 | 421 | 325 | DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.period) FROM demo c FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') set @query = 'SELECT account, ' + @cols + ' from ( select account , value , period from demo ) x pivot ( max(value) for period in (' + @cols + ') ) p ' execute(@query)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With