你可以使用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