表存储结构如下定义
姓名 科目 分数 预期分数
张三 语文 74 90
张三 数学 83 60
张三 物理 93 78
李四 语文 74 100
李四 数学 84 85
李四 物理 94 60
科目中的项是不确定的(不止语文数学物理)
想要得到结果如下
姓名 语文 语文预期分数 数学 数学预期分数 物理 物理预期分数
李四 74 100 84 85 94 94
张三 74 90 83 60 93 78
------解决方案--------------------
----------------------------------------------------------------
-- Author :DBA_HuangZJ(发粪涂墙)
-- Date :2014-03-11 15:37:54
-- Version:
-- Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)
-- Apr 2 2010 15:48:46
-- Copyright (c) Microsoft Corporation
-- Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)
--
----------------------------------------------------------------
--> 测试数据[huang]
if object_id('[huang]') is not null drop table [huang]
go
create table [huang]([姓名] nvarchar(4),[科目] nvarchar(4),[分数] int,[预期分数] int)
insert [huang]
select N'张三',N'语文',74,90 union all
select N'张三',N'数学',83,60 union all
select N'张三',N'物理',93,78 union all
select N'李四',N'语文',74,100 union all
select N'李四',N'数学',84,85 union all
select N'李四',N'物理',94,60
--------------生成数据--------------------------
declare @s nvarchar(4000)
set @s=''
Select @s=@s+','+quotename([科目])+N'=max(case when [科目]=N'+quotename([科目],'''')+N' then [分数] else 0 end)'
+','+quotename([科目]+N'预期分数')+N'=max(case when [科目]=N'+quotename([科目],'''')+N' then [预期分数] else 0 end)'
from [huang] group by [科目]
exec('select [姓名]'+@s+' from [huang] group by [姓名]')
----------------结果----------------------------
/*
姓名 数学 数学预期分数 物理 物理预期分数 语文 语文预期分数
---- ----------- ----------- ----------- ----------- ----------- -----------
张三 83 60 93 78 74 90
李四 84 85 94 60 74 100