【商品销售明细表】字段如下:编号 商品编号 销售日期 销售数量【商品表】 字段如下:商品编号 商品名要求:商品销售明细表  
inner join 商品表
order by 商品销售明细表.商品编号现在需要把数据抽成如下形式  
如果同一商品编号的记录超过三条以上取前三条 不足的填空  
前三条记录 合并为一条记录 :例如 商品销售明细表;
1 001 20100520 300   
2 001 20100521 500   
3 001 20100522 400   
8 001 20100528 400  
 
4 002 20100523 800  
5 002 20100524 300   6 003 20100525 500   7 004 20100526 400
 
商品表
001 诺基亚E72
002 诺基亚E71
003 三星5230
004 空调
商品编号 销售量1 销售日期1 销售量2 销售日期2 销售量3 销售日期3
001 300 20100520 500 20100521 400 20100522  
002 800 20100523 300 20100524  
003 500 20100525  
004 400 20100526  想问一下: 能不能用SQL 实现?

解决方案 »

  1.   

    要使用纯sql实现,至少要确定列数,即销售日期1、销售日期2...销售日期N,这个N是多少
    不确定的话就需要使用过程来拼出sql语句动态执行
      

  2.   

    试试以下的select 商品编号,
    max(decode(rn,1,销售量 ,0)) as  '销售量1'
    max(decode(rn,1,销售日期,0)) as '销售日期1',
    max(decode(rn,2,销售量 ,0)) as  '销售量2'
    max(decode(rn,2,销售日期,0)) as '销售日期2',
    max(decode(rn,3,销售量 ,0)) as  '销售量3'
    max(decode(rn,3,销售日期,0)) as '销售日期3'
    from (
    select 商品编号 ,销售量, 销售日期, 
    dense_rank()over(partition by 商品编号 order by 商品编号,销售日期 ) as  rn
    from 商品销售明细表
    )
    where rn<3
    group by 商品编号 
      

  3.   

    取前三条..我没看清楚
    java3344520的方案可行
      

  4.   

    N就是3 只取 前三个 能不能纯SQL 实现?
      

  5.   

    大哥 能不能用纯SQL 实现呢?
      

  6.   

    你是说不准SQL吧,都分不太清楚了,
    难度比较大,,
      

  7.   

    with tt as
    (
    select * from
    (
    select b.商品编号,b.销售日期,b.销售数量, 
    row_number() over(partition by b.商品编号 order by 1) rn
    from 商品表 a, 商品销售明细表 b
    where a.商品编号 = b.商品编号
    )
    where rn <=3
    ),
    t1 as
    (
    select distinct 商品编号,level rn
    from 商品表
    connect by level <=3
    order by 商品编号,rn
    )
    select 
    商品编号, 
    sum(decode(rn,1,销售数量)) 销售量1, 
    sum(decode(rn,1,销售日期)) 销售日期1, 
    sum(decode(rn,2,销售数量)) 销售量2, 
    sum(decode(rn,2,销售日期)) 销售日期2, 
    sum(decode(rn,3,销售数量)) 销售量3, 
    sum(decode(rn,3,销售日期)) 销售日期3
    from
    (
    select * from tt
    union all
    select 商品编号,null,null,rn
    from t1
    where (商品编号,rn) not in(select 商品编号,rn from tt) 
    )
    group by 商品编号
    order by 商品编号
    ;
      

  8.   


    不准,应该是标准SQL,就是SQL 99啊,这个对我习惯PL/SQL的人来说有点难度,关注。
      

  9.   

    标准SQL,就是SQL 99 呵呵 水平有限 
      

  10.   

    试试
    WITH 商品销售明细表 AS(
      SELECT 1 编号,'001' 商品编号,'20100520' 销售日期,300 数量 FROM dual
      UNION ALL SELECT 2,'001','20100521',500 FROM dual
      UNION ALL SELECT 3,'001','20100522',400 FROM dual
      UNION ALL SELECT 8,'001','20100528',400 FROM dual
      UNION ALL SELECT 4,'002','20100523',800 FROM dual
      UNION ALL SELECT 5,'002','20100524',300 FROM dual
      UNION ALL SELECT 6,'003','20100525',500 FROM dual
      UNION ALL SELECT 7,'004','20100526',400 FROM dual)
    ,商品表 AS(
      SELECT '001' 商品编号,'诺基亚E72' 商品名 FROM dual
      UNION ALL SELECT '002','诺基亚E71' FROM dual
      UNION ALL SELECT '003','三星5230' FROM dual
      UNION ALL SELECT '004','空调' FROM dual)
    --以上为测试数据
    SELECT 商品编号,
      sum(CASE flag WHEN 1 THEN 数量 END) AS 销售量1,
      MAX(CASE flag WHEN 1 THEN 销售日期 END) AS 销售日期1,
      sum(CASE flag WHEN 2 THEN 数量 END) AS 销售量2,
      MAX(CASE flag WHEN 2 THEN 销售日期 END) AS 销售日期2,
      sum(CASE flag WHEN 3 THEN 数量 END) AS 销售量3,
      MAX(CASE flag WHEN 3 THEN 销售日期 END) AS 销售日期3
    from(
    SELECT t1.*,t2.商品名,
      (CASE WHEN not EXISTS(
        SELECT 1 FROM 商品销售明细表 WHERE 商品编号=t1.商品编号
          AND 销售日期<t1.销售日期) THEN 1
        WHEN (SELECT count(1) FROM 商品销售明细表 WHERE 商品编号=t1.商品编号
          AND 销售日期<t1.销售日期)<2 THEN 2
        else 3 end) as flag
    FROM 商品销售明细表 t1 INNER JOIN 商品表 t2
    ON t1.商品编号=t2.商品编号)
    GROUP BY 商品编号
    order by 商品编号;
      

  11.   

    两表的连接条件里还要加上..
      AND (SELECT count(1) FROM 商品销售明细表 WHERE 商品编号=t1.商品编号
          AND 销售日期<t1.销售日期)<3