SAMPLE TABLE
SELECT * INTO #tblStock
FROM
(
SELECT 'A' PartCode, 10 StockQty, 'WHs-A' Location
UNION ALL
SELECT 'B', 22, 'WHs-A'
UNION ALL
SELECT 'A', 1, 'WHs-B'
UNION ALL
SELECT 'C', 20, 'WHs-A'
UNION ALL
SELECT 'D', 39, 'WHs-F'
UNION ALL
SELECT 'E', 3, 'WHs-D'
UNION ALL
SELECT 'F', 7, 'WHs-A'
UNION ALL
SELECT 'A', 9, 'WHs-C'
UNION ALL
SELECT 'D', 2, 'WHs-A'
UNION ALL
SELECT 'F', 54, 'WHs-E'
)TAB
die Spalten für dynamischen Schwenk Erhalten und ersetzen NULL
mit zero
DECLARE @cols NVARCHAR (MAX)
SELECT @cols = COALESCE (@cols + ',[' + Location + ']', '[' + Location + ']')
FROM (SELECT DISTINCT Location FROM #tblStock) PV
ORDER BY Location
-- Since we need Total in last column, we append it at last
SELECT @cols += ',[Total]'
--Varible to replace NULL with zero
DECLARE @NulltoZeroCols NVARCHAR (MAX)
SELECT @NullToZeroCols = SUBSTRING((SELECT ',ISNULL(['+Location+'],0) AS ['+Location+']'
FROM (SELECT DISTINCT Location FROM #tblStock)TAB
ORDER BY Location FOR XML PATH('')),2,8000)
SELECT @NullToZeroCols += ',ISNULL([Total],0) AS [Total]'
Sie CUBE
verwenden können, um Zeilen- und Spaltensumme zu Suchen und Ersetzen NULL
mit Total
für die Zeilen generiert von CUBE
.
DECLARE @query NVARCHAR(MAX)
SET @query = 'SELECT PartCode,' + @NulltoZeroCols + ' FROM
(
SELECT
ISNULL(CAST(PartCode AS VARCHAR(30)),''Total'')PartCode,
SUM(StockQty)StockQty ,
ISNULL(Location,''Total'')Location
FROM #tblStock
GROUP BY Location,PartCode
WITH CUBE
) x
PIVOT
(
MIN(StockQty)
FOR Location IN (' + @cols + ')
) p
ORDER BY CASE WHEN (PartCode=''Total'') THEN 1 ELSE 0 END,PartCode'
EXEC SP_EXECUTESQL @query
RESULT

HINWEIS führen: Wenn Sie möchten NULL
statt zero
als Werte verwenden @cols
statt @NulltoZeroCols
in dynamischen Dreh Code
EDIT:
1. Nur Gesamt-Zeile
- den Code nicht
SELECT @cols += ',[Total]'
und SELECT @NullToZeroCols += ',ISNULL([Total],0) AS [Total]'
anwenden.
- Verwenden Sie
ROLLUP
anstelle von CUBE
.

2. Nur Spaltensumme
- Verwenden Sie den Code
SELECT @cols += ',[Total]'
und SELECT @NullToZeroCols += ',ISNULL([Total],0) AS [Total]'
.
- Verwenden Sie
ROLLUP
anstelle von CUBE
.
- Ändern
GROUP BY Location,PartCode
zu GROUP BY PartCode,Location
.
- Verwenden Sie anstelle von
ORDER BY CASE WHEN (PartCode=''Total'') THEN 1 ELSE 0 END,PartCode
WHERE PartCode<>''TOTAL'' ORDER BY PartCode
.

UPDATE: PartName
für OP bringen
ich die unten Abfrage bin Aktualisierung Ergebnis hinzufügen PartName
mit. Da PartName
zusätzliche Ergebnisse mit CUBE
hinzufügen und Verwechslungen in AND
oder OR
Bedingungen vermeiden, ist es besser, das geschwenkte Ergebnis mit den DISTINCT
Werten in Ihrer Quellentabelle zu verknüpfen.
DECLARE @query NVARCHAR(MAX)
SET @query = 'SELECT P.PartCode,T.PartName,' + @NulltoZeroCols + ' FROM
(
SELECT
ISNULL(CAST(PartCode AS VARCHAR(30)),''Total'')PartCode,
SUM(StockQty)StockQty ,
ISNULL(Location,''Total'')Location
FROM #tblStock
GROUP BY Location,PartCode
WITH CUBE
) x
PIVOT
(
MIN(StockQty)
FOR Location IN (' + @cols + ')
) p
LEFT JOIN
(
SELECT DISTINCT PartCode,PartName
FROM #tblStock
)T
ON P.PartCode=T.PartCode
ORDER BY CASE WHEN (P.PartCode=''Total'') THEN 1 ELSE 0 END,P.PartCode'
EXEC SP_EXECUTESQL @query

Ich habe aktualisiert @Sokea –
Genau was ich brauche, danke @Sarath Avanavu für Ihre Lösung und Erklärung. – Sokea
Willkommen :) @Sokea –