张三参加三门课,李四参加四门课,成绩如下
sname subject score
張三 語文 80
張三 數學 90
張三 物理 85
李四 語文 85
李四 數學 92
李四 物理 82
李四 化學 82
问题:将上表一的数据变成表二格式,如下
sname 语文 数学 物理 化学
李四 85 92 82 82
張三 80 90 85 0
SQL代码如下:
if not object_id(N'Tempdb..#T1') is null
drop table #T1
--测试数据建立
CREATE TABLE #T1 (sname nvarchar(10),[subject] nvarchar(10),score int)
INSERT INTO #T1 VALUES ('張三','語文',80)
INSERT INTO #T1 values ('張三','數學',90)
INSERT INTO #T1 VALUES ('張三','物理',85)
INSERT INTO #T1 VALUES ('李四','語文',85)
INSERT INTO #T1 values ('李四','數學',92)
INSERT INTO #T1 VALUES ('李四','物理',82)
INSERT INTO #T1 VALUES ('李四','化學',82)
select * from #T1
--使用 COALESCE + CASE
SELECT sname,
COALESCE(SUM(CASE [subject] WHEN '語文' THEN score END),0) 语文,
COALESCE(SUM(CASE [subject] WHEN '數學' THEN score END),0) 数学,
COALESCE(SUM(CASE [subject] WHEN '物理' THEN score END),0) 物理,
COALESCE(SUM(CASE subject WHEN '化學' THEN score END),0) 化学
FROM #T1
GROUP BY sname
小结 :表一的记录的值作为表二的字段,则需要使用到 CASE语句,而表一中张三是没有化学成绩的,
所以需要使用 COALESCE。