Click here to Skip to main content
15,888,610 members
Please Sign up or sign in to vote.
5.00/5 (2 votes)
See more:
I am using MS SQL SERVER 2008 and I have following data:
TRXID	ITEM_HEAD_ID	ITEM_HEAD_AMT
6	1	100.00
6	2	100.00
6	3	300.00
7	1	100.00
7	2	100.00
7	3	300.00


I want to make them to be this:
TRXID	1	2	3	Total
6	100	100	300	500
7	100	100	300	500

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?
Posted
Comments
Andrius Leonavicius 19-Apr-14 8:39am    
Hi,

The column "ITEM_HEAD_ID" values are 1, 2 and 3. And you want to transform rows into columns. Is it static or dynamic transformation?

1 solution

You can't remove the aggregate function, but you can construct your query according to your needs. You can do this at least in two ways:

1. Static PIVOT query.
For example, if the column "ITEM_HEAD_ID" values can only be like 1, 2 and 3, then this is what you need. According to your given data, you can use the following query:
SQL
SELECT *, (ISNULL([1], 0 ) + ISNULL([2], 0) + ISNULL([3], 0)) AS [Total]
FROM   (SELECT [TRXID],
               [ITEM_HEAD_ID],
               [ITEM_HEAD_AMT]
        FROM   [Table]) AS t
       PIVOT (MAX([ITEM_HEAD_AMT])
             FOR [ITEM_HEAD_ID] IN ([1], [2], [3])) AS p; 

Note: [Table] is the name of your table.
The result:
XML
TRXID	1	2	3	Total
6	100.00	100.00	300.00	500.00
7	100.00	100.00	300.00	500.00


2. Dynamic PIVOT query.
If the column "ITEM_HEAD_ID" values are not static, then this is what you need. Let's say that you have the following data:
XML
TRXID	ITEM_HEAD_ID	ITEM_HEAD_AMT
6	1		100.00
6	2		100.00
6	3		300.00
7	1		100.00
7	2		100.00
7	3		300.00
7	4		1.00

Example of dynamic query:
SQL
DECLARE @ColumnsTable TABLE ([ColumnName] VARCHAR(50));

INSERT INTO @ColumnsTable ([ColumnName])
SELECT DISTINCT '[' + CONVERT(VARCHAR(48), [ITEM_HEAD_ID]) + ']'
FROM   [Table];

DECLARE @PivotColumns VARCHAR(MAX), @TotalColumn VARCHAR(MAX), @SQL VARCHAR(MAX);

SET @PivotColumns = (SELECT STUFF((SELECT DISTINCT ', ' + CONVERT(VARCHAR(50), [ColumnName])
                                   FROM   @ColumnsTable
                                   FOR XML PATH('')), 1, 2, ''));
SET @TotalColumn = (SELECT STUFF((SELECT DISTINCT ' + ISNULL(' + CONVERT(VARCHAR(50), [ColumnName]) + ', 0)'
                                  FROM   @ColumnsTable
                                  FOR XML PATH('')), 1, 3, ''));
SET @SQL = 'SELECT *, (' + @TotalColumn + ') AS [Total]
FROM   (SELECT [TRXID],
               [ITEM_HEAD_ID],
               [ITEM_HEAD_AMT]
        FROM   [Table]) AS t
       PIVOT (MAX([ITEM_HEAD_AMT])
             FOR [ITEM_HEAD_ID] IN (' + @PivotColumns + ')) AS p;';

EXEC(@SQL);

The result:
XML
TRXID	1	2	3	4	Total
6	100.00	100.00	300.00	NULL	500.00
7	100.00	100.00	300.00	1.00	501.00

Please let me know how it works for you.
 
Share this answer
 
Comments
Member 11605094 19-May-15 5:56am    
i want 0 instead of null ..what can i do?
Andrius Leonavicius 19-May-15 16:56pm    
Hi,

You need to use ISNULL function for that.

It is quite easy to do this in a static PIVOT query. Instead of selecting all columns as *, you need to write each column with ISNULL. So, change
SELECT *
to
SELECT ISNULL([1], 0) + ISNULL([2], 0) + ISNULL([3], 0)

It is harder to do this in a dynamic PIVOT query. I wrote an example for you:

DECLARE @ColumnsTable TABLE ([ColumnName] VARCHAR(50));

INSERT INTO @ColumnsTable ([ColumnName])
SELECT DISTINCT '[' + CONVERT(VARCHAR(48), [ITEM_HEAD_ID]) + ']'
FROM [Table];

DECLARE @Columns VARCHAR(MAX), @PivotColumns VARCHAR(MAX), @TotalColumn VARCHAR(MAX), @SQL VARCHAR(MAX);

SET @Columns = (SELECT STUFF((SELECT DISTINCT ', ISNULL(' + CONVERT(VARCHAR(50),
[ColumnName]) + ', 0) AS ' + [ColumnName]
FROM @ColumnsTable
FOR XML PATH('')), 1, 2, ''));

SET @PivotColumns = (SELECT STUFF((SELECT DISTINCT ', ' + CONVERT(VARCHAR(50), [ColumnName])
FROM @ColumnsTable
FOR XML PATH('')), 1, 2, ''));

SET @TotalColumn = (SELECT STUFF((SELECT DISTINCT ' + ISNULL(' + CONVERT(VARCHAR(50),
[ColumnName]) + ', 0)'
FROM @ColumnsTable
FOR XML PATH('')), 1, 3, ''));

SET @SQL = 'SELECT ' + @Columns + ', (' + @TotalColumn + ') AS [Total]
FROM (SELECT [TRXID],
[ITEM_HEAD_ID],
[ITEM_HEAD_AMT]
FROM [Table]) AS t
PIVOT (MAX([ITEM_HEAD_AMT])
FOR [ITEM_HEAD_ID] IN (' + @PivotColumns + ')) AS p;';

EXEC(@SQL);

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900