药品序号 药品产地 药品数量 进货价格 零售价格 进货金额 零售金额 进货日期
2 17 10 10 15 100 150 2011-1-2
2 17 1 9.5 14 9.5 14 2011-2-1
2 17 10 9.5 15 95 150 2011-2-28要实现相同的药品序号,药品产地,数量求和,进货价格,零售价格(根据进货日期取进货日期最大的进货价格,零售价格),进货金额,批发金额求和。
上面想要结果
药品序号 药品产地 药品数量 进货价格 零售价格 进货金额 零售金额
2 17 21 9.5 15 204.5 314

解决方案 »

  1.   


    select 药品序号, 
            药品产地,
           sum(药品数量) 数量求和,
           max(进货价格) 进货价格,
           max(零售价格) 零售价格,
           sum(进货金额) 进货金额,
           sum(零售金额) 零售金额
    from 表名
      

  2.   

    可能是我没说清楚。  
     max(进货价格) 进货价格,
       max(零售价格) 零售价格,
    是要根据进货日期,取进货日期最大的当前行的进货价格,零售价格。
      

  3.   


    select  药品序号,药品产地,数量求和,进货价格,零售价格,进货金额,零售金额
    (select 药品序号, 
            药品产地,
            sum(药品数量) over(partition by 药品序号,药品产地) 数量求和
            进货价格,
            零售价格,
            进货日期,
            sum(进货金额) over(partition by 药品序号,药品产地) 进货金额,
            sum(零售金额) over(partition by 药品序号,药品产地) 零售金额
    from 表名) t
    where not exists(select null from 表名 where t.药品序号=表名.药品序号
                                                  and t.药品产地=表名.药品产地
                                                  and t.进货日期<表名.进货日期)
      

  4.   

    --怎么个不准,把那些不准的数据发出来看看,可能有些问题没考虑到
    with tb as(
    select 2 药品序号,
           17 药品产地,
           10 药品数量,
           10 进货价格,
           15 零售价格,
           100 进货金额,
           150 零售金额,
           to_date('2011-1-2','yyyy-mm-dd') 进货日期
    from dual union all
    select 2, 17, 1, 9.5, 14, 9.5, 14, to_date('2011-2-1','yyyy-mm-dd') from dual union all
    select 2, 17, 10, 9.5, 15, 95, 150, to_date('2011-2-28','yyyy-mm-dd') from dual)
    select  药品序号,药品产地,数量求和,进货价格,零售价格,进货金额,零售金额
    from
    (select 药品序号,
            药品产地,
            sum(药品数量) over(partition by 药品序号,药品产地) 数量求和,
            进货价格,
            零售价格,
            进货日期,
            sum(进货金额) over(partition by 药品序号,药品产地) 进货金额,
            sum(零售金额) over(partition by 药品序号,药品产地) 零售金额
    from tb) t
    where not exists(select null from tb where t.药品序号=tb.药品序号
                                                  and t.药品产地=tb.药品产地
                                                  and t.进货日期<tb.进货日期)  药品序号   药品产地   数量求和   进货价格   零售价格   进货金额   零售金额
    ---------- ---------- ---------- ---------- ---------- ---------- ----------
             2         17         21        9.5         15      204.5        314
      

  5.   


    --那这样试试
    select 药品序号,药品产地,数量求和,进货价格,零售价格,进货金额,零售金额
    from
    (select 药品序号,
      药品产地,
      sum(药品数量) over(partition by 药品序号,药品产地) 数量求和,
      进货价格,
      零售价格,
      进货日期,
      sum(进货金额) over(partition by 药品序号,药品产地) 进货金额,
      sum(零售金额) over(partition by 药品序号,药品产地) 零售金额,
      row_number()  over(partition by 药品序号,药品产地 order by 进货日期 desc) rn
    from tb) t
    where not exists(select null from tb where t.药品序号=tb.药品序号
      and t.药品产地=tb.药品产地
      and t.进货日期<tb.进货日期)
    and rn=1
      

  6.   


    select 药品序号,药品产地,药品数量,进货价格,零售价格,进货金额,零售金额
    from(
         select 药品序号,药品产地,
                sum(药品数量)over(partition by 药品序号,药品产地) 药品数量,
                进货价格,零售价格,
                sum(进货金额)over(partition by 药品序号,药品产地) 进货金额,
                sum(零售金额)over(partition by 药品序号,药品产地) 零售金额,
                row_number()over(partition by 药品序号,药品产地 order by 进货日期 desc) rn
         from tab
    )
    where rn=1;
      

  7.   


    SELECT A.药品序号,
           A.药品产地,
           SUM(A.药品数量) 数量求和,
           MAX(A.进货价格) 进货价格,
           MAX(A.零售价格) 零售价格,
           SUM(A.进货金额) 进货金额,
           SUM(A.零售金额) 零售金额
      FROM TEST1 A
     WHERE NOT EXISTS (SELECT 1
              FROM TEST1 B
             WHERE A.药品序号 = B.药品序号 
               AND A.药品产地 = B.药品产地 
               AND A.进货日期 < B.进货日期)
     GROUP BY A.药品序号, A.药品产地
      

  8.   

    select 药品序号, 
            药品产地,
           sum(药品数量) 数量求和,
           max(进货价格) 进货价格,
           max(零售价格) 零售价格,
           sum(进货金额) 进货金额,
           sum(零售金额) 零售金额
    from 表名
    group by 药品序号, 药品产地, 进货日期;