表:TestA
员工  报销限额     报销类别
 A         1000        公司报销
 A         500         客户报销 
 B         2000        公司报销表:TestB
ID 员工         报销项目         报销金额     发生日期
1 A          交通费       230        2006-06-01
2 A          住宿费       500        2006-06-10
3 A          交通费       100        2006-06-12
4 B          招待费        300        2006-06-08 
要求统计出以下结果的报表(2006-06-01~2006-06-30),将表TestA中的报销限额按照员工统计,不区分报销类别:
员工    报销限额    交通费    住宿费    招待费  
 A        1500      330        500      0
 B        2000      0          0        300    一句SQL可以汇总出吗?我现在最高金额总是汇总多了,怎么办呢?我的SQL:
select A.员工,Sum(A.报销限额),
'交通'=Sum(Case 报销项目
when '交通费' then B.报销金额
else 0 end),
'住宿'=Sum(Case 报销项目
when '住宿费' then B.报销金额
else 0 end),
'招待'=Sum(Case 报销项目
when '招待费' then B.报销金额
else 0 end)
from
TestA A
left join TestB B on A.员工=b.员工
group by A.员工建表语句:
CREATE TABLE [dbo].[TestA] (
         [ID] [int] IDENTITY (1, 1) NOT NULL ,
[员工] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[报销限额] [numeric](18, 0) NULL ,
[报销类别] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL 
) ON [PRIMARY]CREATE TABLE [dbo].[TestB] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[员工] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[报销项目] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[报销金额] [numeric](18, 0) NULL ,
[发生日期] [datetime] NULL 
) ON [PRIMARY]生成记录:
insert into TestA Values('A','1000','公司报销')
insert into TestA Values('B','2000','客户报销')
insert into TestA Values('A','500','客户报销')
insert into TestB Values('A','交通费','230','2006-6-1')
insert into TestB Values('A','住宿费','500','2006-6-10')
insert into TestB Values('B','招待费','300','2006-6-8')
insert into TestB Values('A','交通费','100','2006-6-12')

解决方案 »

  1.   

    select A.员工,A.报销限额,
    '交通'=Sum(Case 报销项目
    when '交通费' then B.报销金额
    else 0 end),
    '住宿'=Sum(Case 报销项目
    when '住宿费' then B.报销金额
    else 0 end),
    '招待'=Sum(Case 报销项目
    when '招待费' then B.报销金额
    else 0 end)
    from
    (select 员工,sum(报销限额) as 报销限额 from TestA group by 员工) as A
    left join TestB B on A.员工=b.员工
    group by A.员工,A.报销限额
      

  2.   

    如果只有  交通费    住宿费    招待费 這3項,一條SQL可以寫死,
    如果項目不定,需要動態SQL,行轉列問題...
      

  3.   

    select 
        A.员工,A.报销限额,
        '交通'=Sum(Case 报销项目 when '交通费' then B.报销金额 else 0 end),
        '住宿'=Sum(Case 报销项目 when '住宿费' then B.报销金额 else 0 end),
        '招待'=Sum(Case 报销项目 when '招待费' then B.报销金额 else 0 end)
    from
        (select 员工,Sum(报销限额) as 报销限额 from TestA group by 员工) A
    left join 
        TestB B 
    on 
        A.员工=B.员工
    group by 
        A.员工,A.报销限额
      

  4.   

    or:select 员工,sum(报销限额) as 报销限额,sum(交通费) as 交通费,sum(住宿费) as 住宿费,sum(招待费) as 招待费
    from (
    select 员工,报销限额,0 as 交通费,0 as 住宿费,0 as 招待费 from testA
    union all
    select 员工,0 as 报销限额,case 报销项目 when '交通费' then 报销金额 end,
    case 报销项目 when '住宿费' then 报销金额 end,
    case 报销项目 when '招待费' then 报销金额 end
    from testB
    ) as t
    group by 员工
      

  5.   

    To:zicxc(冒牌邹建 V0.3)
    我执行了您的结果,如下:
    员工    报销限额    交通费    住宿费    招待费  
     A        3000      330        500      0
     B        4000      0          0        300 
    报销限额有问题的,好像重复累计了。To:playwarcraft(时间就像乳沟,挤挤还是有的) 
    交通费    住宿费    招待费这几项是死的。
      

  6.   

    CREATE TABLE [dbo].[TestA] (
             [ID] [int] IDENTITY (1, 1) NOT NULL ,
    [员工] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [报销限额] [numeric](18, 0) NULL ,
    [报销类别] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL 
    ) ON [PRIMARY]CREATE TABLE [dbo].[TestB] (
    [ID] [int] IDENTITY (1, 1) NOT NULL ,
    [员工] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [报销项目] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [报销金额] [numeric](18, 0) NULL ,
    [发生日期] [datetime] NULL 
    ) ON [PRIMARY]--生成记录:
    insert into TestA Values('A','1000','公司报销')
    insert into TestA Values('B','2000','客户报销')
    insert into TestA Values('A','500','客户报销')
    --select * from TestAinsert into TestB Values('A','交通费','230','2006-6-1')
    insert into TestB Values('A','住宿费','500','2006-6-10')
    insert into TestB Values('B','招待费','300','2006-6-8')
    insert into TestB Values('A','交通费','100','2006-6-12')
    --select * from TestBselect 
    员工,
    报销限额,
    交通费=(select isnull(sum(报销金额),0) from TestB where 员工=A.员工 and 报销项目='交通费'),
    交通费=(select isnull(sum(报销金额),0) from TestB where 员工=A.员工 and 报销项目='住宿费'),
    交通费=(select isnull(sum(报销金额),0) from TestB where 员工=A.员工 and 报销项目='招待费')
    from 
    (
    select 员工,sum(报销限额) as 报销限额 from TestA group by 员工
    )Adrop table TestA,TestB
      

  7.   

    select 
    员工,
    报销限额,
    交通费=(select isnull(sum(报销金额),0) from TestB where 员工=A.员工 and 报销项目='交通费'),
    住宿费=(select isnull(sum(报销金额),0) from TestB where 员工=A.员工 and 报销项目='住宿费'),
    招待费=(select isnull(sum(报销金额),0) from TestB where 员工=A.员工 and 报销项目='招待费')
    from 
    (
    select 员工,sum(报销限额) as 报销限额 from TestA group by 员工
    )A
      

  8.   

    http://community.csdn.net/Expert/topic/5002/5002960.xml?temp=.563656
    这个是同样问题的贴,各位去这儿灌一下,我一起给分结贴。
    还有:这两天在做一堆报表,可能还得有问题麻烦老几位,辛苦啦!
      

  9.   

    select A.员工,A.报销限额,
    '交通'=Sum(Case 报销项目
    when '交通费' then B.报销金额
    else 0 end),
    '住宿'=Sum(Case 报销项目
    when '住宿费' then B.报销金额
    else 0 end),
    '招待'=Sum(Case 报销项目
    when '招待费' then B.报销金额
    else 0 end)
    from
    (select 员工,sum(报销限额) as 报销限额 from testa group by 员工) A
    left join TestB B on A.员工=b.员工
    group by A.员工,A.报销限额