连建表带查询的语句如下:CREATE TABLE #a(P_Code nvarchar(20))
INSERT #a  SELECT 'A01'
UNION ALL SELECT 'A02'
UNION ALL SELECT 'B01'
UNION ALL SELECT 'B02'CREATE TABLE #b(Con_Code nvarchar(20),Con_Name nvarchar(20))
INSERT #b  SELECT 'W01','一号柜'
UNION ALL SELECT 'W02','二号柜'
UNION ALL SELECT 'W03','三号柜'CREATE TABLE #c(Con_Code nvarchar(20),P_Code nvarchar(20),P_Num int)
INSERT #c  SELECT 'W01','A01',10
UNION ALL SELECT 'W01','A02',20
UNION ALL SELECT 'W02','B01',30
UNION ALL SELECT 'W03','B02',40
UNION ALL SELECT 'W03','A01',100DECLARE @case nvarchar(2000)
DECLARE @sql nvarchar(4000)
SELECT @case=ISNULL(@case,'')+'CASE Con_Name WHEN '''+Con_Name+''' THEN P_Num ELSE 0 END ['+Con_Name+'],' FROM #b ORDER BY Con_Code
PRINT @case
SET @case=SUBSTRING(@case,1,LEN(@case)-1)
SET @sql='SELECT P_Code,'+@case+' FROM (SELECT a.P_Code,c.P_Num,Con_Name FROM #c c INNER JOIN #a a ON c.P_Code=a.P_Code INNER JOIN #b b ON c.Con_Code=b.Con_Code)t'
EXEC(@sql)
现在这样的查询结果为:
P_Code 一号柜 二号柜 三号柜
A01 10 0 0
A02 20 0 0
B01 0 30 0
B02 0 0 40
A01 0 0 100我想得到结果如下:P_Code 一号柜 二号柜  三号柜
A01 10 0 100
A02 20 0 0
B01 0 30 0
B02 0 0 40

解决方案 »

  1.   

    试试这个declare @sql nvarchar(4000)
    set @sql='Select P_Code '
    Select @sql=@sql+',sum(case when Con_Code='''+Con_Code+ ''' then P_Num  else 0 end) As '''+Con_Code+''''
            From #c Group By Con_Code
    Print @sql
    set @sql=@sql+' From #c Group By P_Code'
    Print @sql
    execute sp_executesql @sql
      

  2.   


    --在case上加上sum,最后聚合一下就行了
    DECLARE @case nvarchar(2000)
    DECLARE @sql nvarchar(4000)
    SELECT @case=ISNULL(@case,'')+'SUM(CASE Con_Name WHEN '''+Con_Name+''' THEN P_Num ELSE 0 END) ['+Con_Name+'],' FROM #b ORDER BY Con_Code
    SET @case=SUBSTRING(@case,1,LEN(@case)-1)
    SET @sql='SELECT P_Code,'+@case+' FROM (SELECT a.P_Code,c.P_Num,Con_Name FROM #c c INNER JOIN #a a ON c.P_Code=a.P_Code INNER JOIN #b b ON c.Con_Code=b.Con_Code)t GROUP BY P_Code'
    EXEC(@sql)
    /*
    P_Code               一号柜         二号柜         三号柜
    -------------------- ----------- ----------- -----------
    A01                  10          0           100
    A02                  20          0           0
    B01                  0           30          0
    B02                  0           0           40(4 行受影响)
    */
      

  3.   


    declare @sql varchar(1000)
    set @sql='select c.P_Code'
    select @sql=@sql+',max(case Con_Name when '''+[Con_Name]+''' then P_Num else 0 end) ['+[Con_Name]+']'
    from #b b inner join #c c on b.Con_Code=c.Con_Code group by [Con_Name]
    set @sql=@sql+'from #c c inner join #a a on c.P_Code=a.P_Code inner join #b b on c.Con_Code=b.Con_Code group by c.P_Code'
    exec(@sql)
    /*
    P_Code 二号柜 三号柜 一号柜
    A01    0   100  10
    A02    0   0      20
    B01    30   0      0
    B02    0   40  0
    */
      

  4.   

    楼主离成功只差一步。
    在你之前的基础之上,只要再建个临时表,把上面的结果插入进去,然后再select出来,group by p_code就可以了,很好的。 
      

  5.   

    改进一下:
    declare @sql nvarchar(4000)
    set @sql='Select P_Code '
    Select @sql=@sql+',sum(case when Con_Code='''+#b.Con_Code+ ''' then P_Num  else 0 end) As '''+Con_Name+''''
            From #c INNER JOIN #B on #c.Con_Code=#b.Con_Code Group By #b.Con_Code,#b.Con_Name
    Print @sql
    set @sql=@sql+' From #c Group By P_Code'
    Print @sql
    execute sp_executesql @sql
      

  6.   

    求解释 sql建立临时表改怎么保存?
      

  7.   

    自动保存到SQLSERVER里面,具体的位置没去了解过。生命周期是依赖于连接。连接结束,临时表的生命周期结束。