在Pivot sql中按日期总计

时间:2017-07-04 04:28:19

标签: sql sql-server pivot

我有这样的查询来创建数据透视表并计算项目

CREATE TABLE #SampleData
(
    Name varchar(10),
    Location varchar(20),
    Item varchar(10),
    Date varchar(8)
)
INSERT INTO #SampleData
VALUES
('Ron', 'Loc A', 'Pencil', '20170610'),
('Ron', 'Loc A', 'Pencil', '20170611'),
('Ron', 'Loc B', 'Pen', '20170610'),
('Ron', 'Loc B', 'Laptop', '20170611'),
('Tom', 'Loc A', 'Pencil', '20170611'),
('Tom', 'Loc B', 'Pencil', '20170610'),
('Tom', 'Loc B', 'Pen', '20170610'),
('Tom', 'Loc A', 'Pencil', '20170610'),
('Tom', 'Loc A', 'Laptop', '20170610'),
('Tom', 'Loc A', 'Pencil', '20170610')

	DECLARE @Pivot_Columns  AS VARCHAR(MAX),
			@select_Columns VARCHAR(max)

	SELECT @Pivot_Columns = Stuff((SELECT DISTINCT ',' + Quotename(Item) FROM #SampleData FOR xml path('')), 1, 1, '')
	SELECT @select_Columns = Stuff((SELECT DISTINCT ',Sum(' + Quotename(Item) + ') as '+Quotename(Item) FROM #SampleData FOR xml path('')), 1, 1, '')

	DECLARE @SQL AS VARCHAR(MAX)

	SET @SQL = 'SELECT case when grouping(location) = 1 and grouping(name) = 0 then ''Total''+ '' '' + name 
	when grouping(location) = 1 and grouping(name) = 1 then ''Total'' 
	else name end Name, location, '
			   + @select_Columns + '
	FROM
	(
		SELECT name, location, item
		FROM #SampleData

	) as PivotData
	PIVOT
	(
		count(item)
		for item  IN ('
			   + @Pivot_Columns + ')
	) AS PivotResult
	group by name,location with rollup 
	'

	EXEC(@SQL) 

和这样的结果

enter image description here

如何在总计下方创建总计日期?

enter image description here

我试图使用联盟,但它不起作用。 如何像我的形象一样创造总体? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

不确定您使用动态SQL的原因。试试这个静态SQL:

SELECT case when grouping(location) = 1 and grouping(name) = 0 then 'Total'+ ' ' + name 
when grouping(location) = 1 and grouping(name) = 1 then 'Total' 
else name end Name, location, Sum([Laptop]) as [Laptop],Sum([Pen]) as [Pen],Sum([Pencil]) as [Pencil]
FROM
(
    SELECT name, location, item
    FROM #SampleData

) as PivotData
PIVOT
(
    count(item)
    for item  IN ([Laptop],[Pen],[Pencil])
) AS PivotResult
group by name,location with rollup 
UNION ALL
SELECT 'Total' Name, location, Sum([Laptop]) as [Laptop],Sum([Pen]) as [Pen],Sum([Pencil]) as [Pencil]
FROM
(
    SELECT [date] as location, item
    FROM #SampleData

) as PivotData
PIVOT
(
    count(item)
    for item  IN ([Laptop],[Pen],[Pencil])
) AS PivotResult
group by location
;