你可以使用GROUP BY GROUPING SETS
計算Total item
前Pivot
CREATE TABLE #SampleData
(
Name varchar(10),
Location varchar(20),
Item varchar(10)
)
INSERT INTO #SampleData
VALUES
('Ron', 'Loc A', 'Pencil'),
('Ron', 'Loc A', 'Pencil'),
('Ron', 'Loc B', 'Pen'),
('Ron', 'Loc B', 'Laptop'),
('Tom', 'Loc A', 'Pencil'),
('Tom', 'Loc B', 'Pencil'),
('Tom', 'Loc B', 'Pen'),
('Tom', 'Loc A', 'Pencil'),
('Tom', 'Loc A', 'Laptop'),
('Tom', 'Loc A', 'Pencil')
DECLARE @Columns as VARCHAR(MAX)
SELECT @Columns =
COALESCE(@Columns + ', ','') + QUOTENAME(sd.item)
from (select DISTINCT item from #SampleData) sd
DECLARE @SQL as VARCHAR(MAX)
SET @SQL =
'SELECT name, location, ' + @Columns + '
FROM
(
SELECT CASE WHEN sd.Location is null then ''Total '' + sd.Name
ELSE sd.Name
END as Name,
sd.Name as GroupName,
sd.Location, sd.item, count(item) AS CountValue
FROM #SampleData sd
GROUP BY GROUPING SETS ((sd.Name, sd.Location, sd.item),(sd.Name, sd.item))
) as PivotData
PIVOT
(
sum(CountValue)
for item IN (' + @Columns + ')
) AS PivotResult
Order by GroupName, name
'
EXEC(@SQL)
DROP TABLE #SampleData
演示鏈接:http://rextester.com/GTKM34090
使用[GROUPING](https://docs.microsoft.com/en-us/sql/t-sql/functions/grouping-transact-sql)而不是'Case'語句。 –
所用的連接方法不能保證能正常工作。總是最好使用'xml path()'。希望你不介意說這些建議 –
我剛剛複製了OP的代碼。 :) – TriV