print @sql看看你连接后的语句是否正确...

解决方案 »

  1.   

    create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
    insert into tb values('张三' , '语文' , 74)
    insert into tb values('张三' , '数学' , 83)
    insert into tb values('张三' , '物理' , 93)
    insert into tb values('李四' , '语文' , 74)
    insert into tb values('李四' , '数学' , 84)
    insert into tb values('李四' , '物理' , 94)
    select UserName,sum(case when Subject= '数学' then Score else 0 end) [数学],sum(case when Subject= '物理' then Score else 0 end) [物理],sum(case when Subject= '语文' then Score else 0 end) [语文]
    declare @sql varchar(1000)
    set @sql='select UserName'
    select @sql=@sql+',sum(case when Subject= ''' +Subject+ ''' then Score else 0 end) ['+Subject+']' from (select distinct Subject from tb)aset @sql = @sql + ' from tb group by UserName'
    print @sql
    exec(@sql) 
    --讲解:--这个是第一次执行
    select 姓名,max(case 课程 when '数学' then 分数 else 0 end) [数学], 
    --这个是第二次
    select 姓名,max(case 课程 when '数学' then 分数 else 0 end) [数学], max(case 课程 when '物理' then 分数 else 0 end) [物理] , 
    --这个是第三次
    select 姓名,max(case 课程 when '数学' then 分数 else 0 end) [数学], max(case 课程 when '物理' then 分数 else 0 end) [物理] , max(case 课程 when '语文' then 分数 else 0 end) [语文] 
    --这个的数量来自于
    (select distinct 课程 from tb)--这里只有3们课程create table tb(id int, value varchar(10))
    insert into tb values(1, 'aa')
    insert into tb values(1, 'bb')
    insert into tb values(2, 'aaa')
    insert into tb values(2, 'bbb')
    insert into tb values(2, 'ccc')
    gocreate function dbo.f_str(@id int) returns varchar(100)
    as
    begin
        declare @str varchar(1000)
        set @str = ''
        select @str = @str + ',' + cast(value as varchar) from tb where id = @id
        set @str = right(@str , len(@str) - 1)
        return @str
    end
    go--调用函数
    select id , value = dbo.f_str(id) from tb group by iddrop function dbo.f_str
    drop table tb
    我只说一个地方 
    select @str = @str + ',' + cast(value as varchar) from tb where id = @id 
    你把这个看懂就明白了 
    例如当@id=1 
    select @str = @str + ',' + cast(value as varchar) from tb where id = 1 
    把满足id=1的str值通过','累加 
    当id是动态的就是1或者2...是当满足1的查询完了,把值付给str之后 
    在查询满足2的直到所有的ID完为止 
    这样明白了吧 
      

  2.   

    没有明白我的意思,麻烦看一下我的语句,语句可以正确执行,就是只显示a表和c表匹配的记录,我要显示a表全部的记录和c表匹配的记录。
      

  3.   


    你的代码中貌似全是用的 join ,而没有见到 left join 啊...
      

  4.   

    我用left join试过,不行啊!
      

  5.   

    alter PROCEDURE [dbo].[pqJiaGongZhuWuBuLiangMX] 
      @DyStartDate datetime = '2010-8-1',
      @DyEndDate   datetime = '2010-8-31'
    AS
    BEGIN
      DECLARE @sql VARCHAR(4000)
      SET @sql = 'SELECT a.pf, a.bf, a.pm'
      SELECT  @sql = @sql + ',SUM(CASE WHEN d.xm=''' + xm + ''' THEN sl ELSE NULL END) AS [' + xm + ']'
      FROM (select xm from tqBuLiangXiangMu where xmlb = 5) t
      SELECT  @sql = @sql + 
      ' FROM tpJiChuZiLiao a  left join tpData c ON a.pf=c.pf left join tqBuLiangXiangMu d ON c.blxm = d.id
        WHERE c.rq BETWEEN ''' + CONVERT(CHAR(10), @DyStartDate) + ''' AND ''' + CONVERT(CHAR(10), @DyEndDate)+ ''' AND c.bdid =5
        GROUP BY a.pf,a.bf,a.pm'
     
     EXEC (@sql)
    END
    试试看看先把语句PRINT出来,查询下,是否可以 。不行的话,就看看LEFT JION 的用法是 
      

  6.   

    如果没看错,初步估计你是想left join  但你没有left join啊   只是join了
      

  7.   

    其实各位都把这个想的太简单了,如果有兴趣可以试一试,看看用left join会不会达到要求。