现有2个表
表一:
费用分类表
ID    费用名称表二:
月销售费用一览表
年   月    ID    金额
这么做是为了可以灵活的设置费用项。
现在想要查询出一张总表:年,月,费用名1,费用名2....
2006,7,100,200不知道怎么写sql语句了,大家帮帮忙。

解决方案 »

  1.   

    declare @s varchar(8000)
    set @s=''
    select @s=@s+',['+费用名称+']=sum(case ID when '+rtrim(ID)+' then 金额 else 0 end)' from 表一 order by ID
    set @s='select 年,月'+@s+' from 表二 group by 年,月 order by 年,月'
    exec(@s)
      

  2.   

    帮助中的例子,你可以参考一下:SELECT P1.*, (P1.Q1 + P1.Q2 + P1.Q3 + P1.Q4) AS YearTotal
    FROM (SELECT Year,
                 SUM(CASE P.Quarter WHEN 1 THEN P.Amount ELSE 0 END) AS Q1,
                 SUM(CASE P.Quarter WHEN 2 THEN P.Amount ELSE 0 END) AS Q2,
                 SUM(CASE P.Quarter WHEN 3 THEN P.Amount ELSE 0 END) AS Q3,
                 SUM(CASE P.Quarter WHEN 4 THEN P.Amount ELSE 0 END) AS Q4
         FROM Pivot AS P
         GROUP BY P.Year) AS P1
      

  3.   

    CREATE TABLE 表A(id int ,项目 varchar(10))
    INSERT INTO 表A SELECT 1,'a'
    UNION ALL SELECT 2,'b'
    UNION ALL SELECT 3,'c'
    UNION ALL SELECT 4,'d'
    UNION ALL SELECT 5,'e'
    UNION ALL SELECT 6,'f'
    UNION ALL SELECT 7,'g'CREATE TABLE 表B(体检编号 Varchar(20),项目 Varchar(10),结果 Varchar(10))
    INSERT INTO 表B SELECT '200607220001','a','正常'
    UNION ALL SELECT '200607220001', 'b','正常'
    UNION ALL SELECT '200607220001', 'c','不正常'
    UNION ALL SELECT '200607220002', 'a','不正常'
    UNION ALL SELECT '200607220002', 'b','正常'
    UNION ALL SELECT '200607220002', 'f','正常'
    UNION ALL SELECT '200607220002', 'g','正常'select * from 表A
    select * from 表BDeclare @sql varchar(8000)
    set @sql='select 体检编号'
    select @sql=@sql+',max(case 项目 when'''+项目+''' then 结果 else NULL end)['+项目+']'
    from (select distinct 项目 from 表A) as a
    select @sql=@sql+'from 表B group by 体检编号'
    print @sql
    exec(@sql)select 体检编号,max(case 项目 when'a' then 结果 else NULL end)[a],max(case 项目 when'b' then 结果 else NULL end)[b],max(case 项目 when'c' then 结果 else NULL end)[c],max(case 项目 when'd' then 结果 else NULL end)[d],max(case 项目 when'e' then 结果 else NULL end)[e],max(case 项目 when'f' then 结果 else NULL end)[f],max(case 项目 when'g' then 结果 else NULL end)[g]from 表B group by 体检编号参考这个两表间的行转列