Beispieltabelle
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
Holen Sie sich die Spalten für dynamisches Pivotieren und ersetzen Sie 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 können CUBE
verwenden um Zeilen- und Spaltensummen zu finden und NULL
zu ersetzen mit Total
für die von CUBE
generierten Zeilen .
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
- Klicken Sie hier Ergebnis anzeigen
ERGEBNIS
HINWEIS:Wenn Sie NULL
möchten statt zero
Verwenden Sie als Werte @cols
statt @NulltoZeroCols
im dynamischen Pivot-Code
BEARBEITEN :
1. Nur Zeilensumme anzeigen
- Verwenden Sie nicht den Code
SELECT @cols += ',[Total]'
undSELECT @NullToZeroCols += ',ISNULL([Total],0) AS [Total]'
. - Verwenden Sie
ROLLUP
stattCUBE
.
2. Nur Spaltensumme anzeigen
- Verwenden Sie den Code
SELECT @cols += ',[Total]'
undSELECT @NullToZeroCols += ',ISNULL([Total],0) AS [Total]'
. - Verwenden Sie
ROLLUP
stattCUBE
. - Ändern Sie
GROUP BY Location,PartCode
zuGROUP BY PartCode,Location
. - Statt
ORDER BY CASE WHEN (PartCode=''Total'') THEN 1 ELSE 0 END,PartCode
, verwenden SieWHERE PartCode<>''TOTAL'' ORDER BY PartCode
.
UPDATE :Um PartName
zu bringen für OP
Ich aktualisiere die folgende Abfrage, um PartName
hinzuzufügen mit Ergebnis. Seit PartName
fügt zusätzliche Ergebnisse mit CUBE
hinzu und um Verwirrung in AND
zu vermeiden oder OR
Bedingungen, ist es besser, das Pivot-Ergebnis mit dem DISTINCT
zu verbinden Werte in Ihrer Quelltabelle.
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
- Klicken Sie hier Ergebnis anzeigen