比如:table1里面有字段:日期,数量,商品号
20040101,10,001
20040201,11,002
20040301,15,003
20040401,12,001
20040501,16,002
20040601,18,003
我现在想用一条sql文实现,当我给出日期20040115和20040415两个日期后,出现以下效果:
商品号 期前数量 期中数量 期后数量
001     10        0        0
002      0       11       16
003      0       15       30
请问可以实现吗?如果不行应该怎么办?谢谢!!

解决方案 »

  1.   

    select 
    sum(CASE WHEN dt < dt1 THEN value ELSE 0),
    sum(CASE WHEN dt between dt1 and dt2 THEN value ELSE 0),
    sum(CASE WHEN dt > dt2 THEN value ELSE 0)
    from t
      

  2.   

    select 商品号
    sum(CASE WHEN dt < dt1 THEN value ELSE 0),
    sum(CASE WHEN dt between dt1 and dt2 THEN value ELSE 0),
    sum(CASE WHEN dt > dt2 THEN value ELSE 0)
    from t
    group by 商品号
      

  3.   

    请问我的那个数量的字段应该写在哪里?select 商品号
    sum(数量 CASE WHEN 日期 < dt1 THEN value ELSE 0),
    sum(数量 CASE WHEN 日期 between dt1 and dt2 THEN value ELSE 0),
    sum(数量 CASE WHEN 日期 > dt2 THEN value ELSE 0)
    from t
    group by 商品号
    是这样吗?
      

  4.   

    请问在orcale里面的语法是什么样的?要实现上面的功能?
      

  5.   

    SQL Server 中可以这样实现select 商品号,
    sum(CASE WHEN 日期 < 日期1 THEN 数量 ELSE 0 END),
    sum(CASE WHEN 日期 between 日期1 and 日期2 THEN 数量 ELSE 0 END),
    sum(CASE WHEN 日期 > 日期2 THEN 数量 ELSE 0 END)
    from 表
    group by 商品号
    -- orcale 中不清楚
      

  6.   

    再加上标题select 商品号,
    sum(CASE WHEN 日期 < 日期1 THEN 数量 ELSE 0 END) as 期前数量,
    sum(CASE WHEN 日期 between 日期1 and 日期2 THEN 数量 ELSE 0 END) as 期中数量,
    sum(CASE WHEN 日期 > 日期2 THEN 数量 ELSE 0 END) as 期后数量
    from 表
    group by 商品号  
      

  7.   

    SELECT SUM(期前数量) 期前数量, SUM(期中数量) 期中数量,SUM(期后数量) 期后数量
    FROM (
        SELECT NVL(SUM(数量), 0) 期前数量, 0 期中数量, 0 期后数量, 商品号
        FROM T
        WHERE 日期 < DT1
        GROUP BY 商品号
        UNION
        SELECT 0 期前数量, NVL(SUM(数量), 0) 期中数量, 0 期后数量, 商品号
        FROM T
        WHERE 日期 >= DT1 AND 日期 <= DT2
        GROUP BY 商品号
        UNION ALL
        SELECT 0 期前数量, 0 期中数量, NVL(SUM(数量), 0) 期后数量, 商品号
        FROM T
        WHERE 日期 > DT2
        GROUP BY 商品号
      ) TT
    GROUP BY 商品号;
      

  8.   

    SELECT SUM(期前数量) 期前数量, SUM(期中数量) 期中数量,SUM(期后数量) 期后数量
    FROM (
        SELECT NVL(SUM(数量), 0) 期前数量, 0 期中数量, 0 期后数量, 商品号
        FROM T
        WHERE 日期 < DT1
        GROUP BY 商品号
        UNION ALL
        SELECT 0 期前数量, NVL(SUM(数量), 0) 期中数量, 0 期后数量, 商品号
        FROM T
        WHERE 日期 >= DT1 AND 日期 <= DT2
        GROUP BY 商品号
        UNION ALL
        SELECT 0 期前数量, 0 期中数量, NVL(SUM(数量), 0) 期后数量, 商品号
        FROM T
        WHERE 日期 > DT2
        GROUP BY 商品号
      ) TT
    GROUP BY 商品号;
      

  9.   

    SELECT SUM(期前数量) 期前数量, SUM(期中数量) 期中数量,SUM(期后数量) 期后数量, 商品号
    FROM (
        SELECT NVL(SUM(数量), 0) 期前数量, 0 期中数量, 0 期后数量, 商品号
        FROM T
        WHERE 日期 < DT1
        GROUP BY 商品号
        UNION ALL
        SELECT 0 期前数量, NVL(SUM(数量), 0) 期中数量, 0 期后数量, 商品号
        FROM T
        WHERE 日期 >= DT1 AND 日期 <= DT2
        GROUP BY 商品号
        UNION ALL
        SELECT 0 期前数量, 0 期中数量, NVL(SUM(数量), 0) 期后数量, 商品号
        FROM T
        WHERE 日期 > DT2
        GROUP BY 商品号
      ) TT
    GROUP BY 商品号;
      

  10.   

    ------------------------------------------------
    TEST DATA
    use pubs
    create table goods
    (Gdate smalldatetime,
      GTotal   int,
      Gnum   char(3))
    insert into goods
    values('20040201',11,'002')
    insert into goods
    values('20040301',15,'003')
    insert into goods
    values('20040401',12,'001')
    insert into goods
    values('20040501',16,'002')
    insert into goods
    values('20040601',18,'003')
    ---------------------------------
    use pubs select * from goodsuse pubs
    select gnum,
    sum(CASE WHEN gdate < '20040110' THEN gtotal ELSE 0 END),
    sum(CASE WHEN gdate between '20040110' and '20040510' THEN gtotal ELSE 0 END),
    sum(CASE WHEN gdate > '20040510' THEN gtotal ELSE 0 END)
    from goods
    group by gnum
    --use pubs drop goods
      

  11.   

    (3 row(s) affected)
    001   10     12       0
    002    0     27       0
    003    0     15       18
      

  12.   

    十分感谢大家的帮助!谢谢
    特别是 windindance 、 lbl20020123 和 pressman 。