有2个表:【A表】和【B表】; 
---------------------------------------------------------------- 
1、【A表】字段: 
日期          货品编号      单据号      销售数量      销售金额 
08/05/04      001        1          20          2000 
08/06/04      002        2          10          1000 
08/06/08      001        3          30          3000 
08/06/09      002        4          70          7000 
08/06/09      003        5          10          1000 
----------------------------------------------------------------- 
2、【B表】字段: 
日期          货品编号      单据号      销售数量      销售金额      状态 
08/05/04      001        1          10          1000        C 
08/06/04      002        2          10          1000        R    
08/06/08      001        3          10          1000        R 
08/06/09      002        4          10          1000        C 
----------------------------------------------------------------- 
【说明】:两个表中的【日期】和【单据号】都是相对应的; 【描述】:1.首先分组统计出在限定时间段内【A表】中各【货品编号】的【销售数量】和【销售金额】的总和
          2.用【A表】中各分组统计的结果与【B表】中的各项进行“加减运算”注:(当【状态】项="C" 时 与【A表】中的【货品编码】项相同的数据进行 “减法 - ”运算); 
            反之【状态】项=“R”则进行"加法 + "运算; 【结果】:1.再分组合计出运算后的【货品编号】字段项; 
          2.结果要是在【日期>=08/06/04 and 日期 <=08/06/10】时间段内的!
------------------------------------------------------------------------------------------------------
结果如下:
 货品编号      销售数量       销售金额
   001          50           5000
   002          80           8000
   003          10           1000
------------------------------------------------------------
求SQL语句的写法!谢谢!
之前的问题一直没有解决,还请高手帮忙解决!先谢谢大家了!

解决方案 »

  1.   

    --1
    select 日期 ,货品编号,sum(销售数量),sum(销售金额) from ta group by 日期 ,货品编号
      

  2.   

    --你的日期是否写错了一个?
    create table A(日期 datetime,货品编号 varchar(10), 单据号 int, 销售数量 int, 销售金额 int)
    insert into A values('08/05/04' , '001' , 1 , 20 , 2000) 
    insert into A values('08/06/04' , '002' , 2 , 10 , 1000) 
    insert into A values('08/06/08' , '001' , 3 , 30 , 3000) 
    insert into A values('08/06/09' , '002' , 4 , 70 , 7000) 
    insert into A values('08/06/09' , '003' , 5 , 10 , 1000) 
    create table B(日期 datetime, 货品编号 varchar(10), 单据号 int, 销售数量 int, 销售金额 int, 状态 varchar(1))
    insert into B values('08/05/04' , '001' , 1 , 10 , 1000 , 'C') 
    insert into B values('08/06/04' , '002' , 2 , 10 , 1000 , 'R') 
    insert into B values('08/06/08' , '001' , 3 , 10 , 1000 , 'R') 
    insert into B values('08/06/09' , '002' , 4 , 10 , 1000 , 'C') select 货品编号 , sum(销售数量) 销售数量 , sum(销售金额) 销售金额 from
    (
      select 货品编号 , sum(销售数量) 销售数量 , sum(销售金额) 销售金额 from A where 日期 between '08/06/04' and '08/06/10' group by 货品编号
      union all
      select 货品编号 , sum(case when 状态 = 'C' then - 销售数量 else 销售数量 end) 销售数量 , sum(case when 状态 = 'C' then - 销售金额 else 销售金额 end) 销售金额 from B where 日期 between '08/06/04' and '08/06/10' group by 货品编号
    ) t
    group by 货品编号drop table A , B/*
    货品编号       销售数量        销售金额        
    ---------- ----------- ----------- 
    001        40          4000
    002        80          8000
    003        10          1000(所影响的行数为 3 行)
    */--即使把日期08/05/04 改为08/06/04 ,你的结果仍然不对.
    create table A(日期 datetime,货品编号 varchar(10), 单据号 int, 销售数量 int, 销售金额 int)
    insert into A values('08/06/04' , '001' , 1 , 20 , 2000) 
    insert into A values('08/06/04' , '002' , 2 , 10 , 1000) 
    insert into A values('08/06/08' , '001' , 3 , 30 , 3000) 
    insert into A values('08/06/09' , '002' , 4 , 70 , 7000) 
    insert into A values('08/06/09' , '003' , 5 , 10 , 1000) 
    create table B(日期 datetime, 货品编号 varchar(10), 单据号 int, 销售数量 int, 销售金额 int, 状态 varchar(1))
    insert into B values('08/06/04' , '001' , 1 , 10 , 1000 , 'C') 
    insert into B values('08/06/04' , '002' , 2 , 10 , 1000 , 'R') 
    insert into B values('08/06/08' , '001' , 3 , 10 , 1000 , 'R') 
    insert into B values('08/06/09' , '002' , 4 , 10 , 1000 , 'C') select 货品编号 , sum(销售数量) 销售数量 , sum(销售金额) 销售金额 from
    (
      select 货品编号 , sum(销售数量) 销售数量 , sum(销售金额) 销售金额 from A where 日期 between '08/06/04' and '08/06/10' group by 货品编号
      union all
      select 货品编号 , sum(case when 状态 = 'C' then - 销售数量 else 销售数量 end) 销售数量 , sum(case when 状态 = 'C' then - 销售金额 else 销售金额 end) 销售金额 from B where 日期 between '08/06/04' and '08/06/10' group by 货品编号
    ) t
    group by 货品编号drop table A , B/*
    货品编号       销售数量        销售金额        
    ---------- ----------- ----------- 
    001        50          5000
    002        80          8000
    003        10          1000(所影响的行数为 3 行)
    */
      

  3.   

    不好意思我的日期写错了一个!
    应该是【日期>=08/05/04 and 日期 <=08/06/10
      

  4.   

    select a.货品编号,a.销售数量-b.销售数量 销售数量,a.销售金额-b.销售金额 销售金额 from 
    ( SELECT 货品编号,sum(销售数量)销售数量,sum(销售金额)销售金额 FROM A 
        WHERE 日期>='2008/06/04' and 日期 <='2008/06/10' GROUP BY 货品编号
    )TA left join B on TA.货品编号=TB.货品编号 where TB.状态='C'
      

  5.   

    if object_id('tempdb..#a')is not null drop table #a
    go
    create table #a( 日期 varchar(10),货品编号  varchar(10),    单据号 int,      销售数量 int,     销售金额 int)
    insert #a select '08/05/04' ,     '001' ,       1 ,         20 ,         2000 
    insert #a select '08/06/04' ,     '002' ,       2 ,         10 ,         1000 
    insert #a select '08/06/08' ,     '001' ,       3 ,         30 ,         3000 
    insert #a select '08/06/09' ,     '002' ,       4 ,         70 ,         7000 
    insert #a select '08/06/09' ,     '003' ,       5 ,         10 ,         1000 
    ----------------------------------------------------------------- 
    if object_id('tempdb..#b')is not null drop table #b
    go
    create table #b( 日期 varchar(10),货品编号  varchar(10),    单据号 int,      销售数量 int,     销售金额 int,状态 varchar(10))
    insert #b select '08/05/04'   ,   '001'    ,    1,          10    ,      1000 ,       'C' 
    insert #b select '08/06/04'  ,    '002'   ,     2 ,         10   ,       1000 ,       'R'    
    insert #b select '08/06/08' ,     '001'  ,      3  ,        10  ,        1000 ,       'R' 
    insert #b select '08/06/09' ,     '002' ,       4   ,       10 ,         1000 ,       'C'select 货品编号 , sum(销售数量) 销售数量 , sum(销售金额) 销售金额 from
    (
      select 货品编号 , sum(销售数量) 销售数量 , sum(销售金额) 销售金额 from #a where 日期 between '08/06/04' and '08/06/10' group by 货品编号
      union all
      select 货品编号 , sum(case when 状态 = 'C' then - 销售数量 else 销售数量 end) 销售数量 , sum(case when 状态 = 'C' then - 销售金额 else 销售金额 end) 销售金额 from #B where 日期 between '08/06/04' and '08/06/10' group by 货品编号
    ) t
    group by 货品编号
    /*
    货品编号       销售数量        销售金额        
    ---------- ----------- ----------- 
    001        40          4000
    002        80          8000
    003        10          1000
    */
      

  6.   

    select Ta.货品编号,Ta.销售数量-isnull(Tb.销售数量,0) 销售数量,Ta.销售金额-isnull(Tb.销售金额,0) 销售金额 from 
    ( SELECT 货品编号,sum(销售数量)销售数量,sum(销售金额)销售金额 FROM A 
        WHERE 日期>='2008/05/04' and 日期 <='2008/06/10' GROUP BY 货品编号
    )TA left join B TB on TA.货品编号=TB.货品编号 and TB.状态='C'
      

  7.   

     declare
    @date1 datetime,
    @date2 datetime
    select 货品编号,销售数量=sum(case when 状态=C then a.销售数量-B.销售数量
    when 状态=R then a.销售数量-B.销售数量 
    end)
     ,销售金额 =sum(case when 状态=C then aa.销售金额-B.销售金额
    when 状态=R then aa.销售金额-B.销售金额 
    end)
    from B,(select 货品编号,销售数量=sum(销售数量),销售金额=sum(销售金额) from A where
    日期>=@date1 and 日期<=@date2 group by  货品编号)aa
    where B.货品编号=aa.货品编号
    group by 货品编号