CREATE TABLE [Test] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[name] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[subject] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[score] [numeric](18, 0) NULL ,
CONSTRAINT [PK_ID] PRIMARY KEY  CLUSTERED 
(
[id]
)  ON [PRIMARY] 
) ON [PRIMARY]
GOinsert into test([name],[subject],[score]) values('张三','语文',60)
insert into test([name],[subject],[score]) values('张三','数学',76)
insert into test([name],[subject],[score]) values('张三','英语',80)insert into test([name],[subject],[score]) values('李四','语文',90)
insert into test([name],[subject],[score]) values('李四','数学',88)
insert into test([name],[subject],[score]) values('李四','英语',50)
declare @sql nvarchar(4000)
select @sql='select name,'
select @sql=@sql+'sum(case subject when '''+subject+'''
then score else 0 end) as '''+subject+''','
from (select distinct subject from test) as aprint @sql为什么这条语句..能够输出
select name,sum(case subject when '数学'
then score else 0 end) as '数学',sum(case subject when '英语'
then score else 0 end) as '英语',sum(case subject when '语文'
then score else 0 end) as '语文',这样?它是怎么工作的?

解决方案 »

  1.   

    就是当我
    declare @sql nvarchar(4000)
    select @sql='select name,'
    select @sql=@sql+'sum(case subject when '''+subject+'''
    then score else 0 end) as '''+subject+''','
    from (select distinct subject from test) as aprint @sql
    输入@sql的时候.好像是实现了记录的循环.但又不知道是如何工作的.
      

  2.   

    哈哈
    就是一个存储过程,它把句子存在一个文件里了
    最后print @sql
    就输出了,没有什么问题啊
      

  3.   

    CREATE TABLE [Test] (
    [id] [int] IDENTITY (1, 1) NOT NULL ,
    [name] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [subject] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [score] [numeric](18, 0) NULL ,
    CONSTRAINT [PK_ID] PRIMARY KEY  CLUSTERED 
    (
    [id]
    )  ON [PRIMARY] 
    ) ON [PRIMARY]
    GO
    ------------建立表
    insert into test([name],[subject],[score]) values('张三','语文',60)
    insert into test([name],[subject],[score]) values('张三','数学',76)
    insert into test([name],[subject],[score]) values('张三','英语',80)insert into test([name],[subject],[score]) values('李四','语文',90)
    insert into test([name],[subject],[score]) values('李四','数学',88)
    insert into test([name],[subject],[score]) values('李四','英语',50)
    -----------插入六条记录
    declare @sql nvarchar(4000) ---定义变量@sql
    select @sql='select name,'  ---------给@sal赋值
    select @sql=@sql+'sum(case subject when '''+subject+'''
    then score else 0 end) as '''+subject+''',' --再次给@sql赋值from (select distinct subject from test) as a 取出test表中subject中不重复的记录
      

  4.   

    select @sql=@sql+'sum(case subject when '''+subject+'''
                                               ~~~~~~看这里用表a里的subject字段里的值替换我划线的部分
    对每个字段都作一次,不是就有3句了吗?
    这下明白了吗?
      

  5.   

    case subject when '''+subject+'''
    then score else 0 end) as '''+subject+''','
    -----subject有一条不重复的记录,有循环显示一次,所以是"数学,语言,英语"三条记录