I have following data.
state    f_name     product     paymonth     income     expense     savings
state_1  f1         product_1   apr-2013     5000       1500        3500
state_1  f1         procudt_1   may-2013     4500       3000        1500
state_1  f1         procudt_2   may-2013     4500       3000        1500
state_2  f2         product_2   apr-2013     15000      11500       35000
state_2  f2         product_3   aug-2013     1500       500         1000
Pivot on paymonth column with headers like these which is desired result...
state    f_name   product    apr-2013_income   apr-2013_expense   apr-2013_savings   may-2013_income   may-2013_expense.....and so on for distinct paymonth
state_1  f1       product_1  5000              1500               3500               4500              3000....and so on....
state_1  f1       product_2  0                 0                  0                  4500              3000....
Now, the real problem is state, f_name and products must remain as columns and they are dynamic.
Also paymonth and other data is dynamic.
Need to use Pivot. I googled some examples but not getting what i want.
This is what i tried...
DECLARE @COLS AS NVARCHAR(MAX) = ''
SELECT @COLS = COALESCE(@COLS + ', ', '') + QUOTENAME(PAYMONTH)
FROM #DATA
GROUP BY PAYMONTH, PM ORDER BY PM --pm is last date of paymonth for ordering data in asc/desc
declare @QUERY AS NVARCHAR(MAX) = ''
SET @QUERY = 'SELECT state, product, f_name, ' + @COLS + ' FROM
(
    SELECT state, product, f_name, income, paymonth--, expense, saving,
    FROM #DATA
) X
PIVOT
(
         SUM(income)
         FOR paymonth IN (' + @COLS + ')
) P
ORDER BY state, product, f_name'
execute(@query)
This will give correct result for pivot on paymonth for income but i cant do it for all 3, income, expense and savings.
Tried cross apply and unpivot but failed.
Need help in this. Thanks.
