透视表处理方案研究

IF EXISTS (
SELECT *
FROM sys.objects
WHERE OBJECT_ID = OBJECT_ID(N'[dbo].[TB_Student]')
AND TYPE IN (N'U')
)
DROP TABLE [dbo].[TB_Student]
GO

CREATE TABLE TB_Student
(
S_Name NVARCHAR(50),
B_Name NVARCHAR(50),
S_No INT
)

INSERT TB_Student
(
S_Name,
B_Name,
S_No
)
SELECT '小王',
'Excel教材',
10
UNION ALL
SELECT '小李',
'Excel教材',
15
UNION ALL
SELECT '小王',
'Word教材',
8
UNION ALL
SELECT '小李',
'Excel教材',
7
UNION ALL
SELECT '小王',
'Excel教材',
9
UNION ALL
SELECT '小李',
'Excel教材',
2
UNION ALL
SELECT '小王',
'Word教材',
3
UNION ALL
SELECT '小李',
'Excel教材',
5

SELECT v.*,
m.SUM
FROM (
SELECT S_NAME,
ISNULL(Excel教材, 0) 'Excel教材',
ISNULL(Word教材, 0) 'Word教材'
FROM TB_Student
PIVOT(SUM(S_No) FOR B_Name IN (Excel教材, Word教材)) AS
pvt
) v
INNER JOIN (
SELECT S_NAME,
SUM(S_No) [SUM]
FROM TB_Student
GROUP BY
S_NAME
) m
ON v.S_NAME = m.S_NAME

DECLARE @sql NVARCHAR(1000)
SET @sql = 'SELECT S_Name, '
SELECT @sql = @sql + 'sum(case B_Name when ' + QUOTENAME(B_Name, '''') +
' then S_No else 0 end) as ' + QUOTENAME(B_Name) + ','
FROM TB_Student
GROUP BY B_Name

SELECT @sql = LEFT(@sql, LEN(@sql) -1)
SELECT @sql = @sql + ', sum(S_No) as [sum] from TB_Student group by [S_Name]'
SELECT @sql
EXEC (@sql)

原文地址:https://www.cnblogs.com/fery/p/1865769.html