先介绍相关具体业务: a,b,c三张表
a表是物理表:库存表。b,c表是库存表和其他业务(调拨,销售)产生的虚拟表a表:
id    logic        now
编号  可用库存, 实际库存b表:b表是列出经过调拨,使可用库存变化的表
c表:c表是列出经过销售,使可用库存变化的表
下面要列出可用库存改变(调拨/销售)的数据,并将该数据对库存表a表中的可用库存进行对比
也就是b,c两个表求合集,再和a表求交集也就是说要求ex:
a表id:1,2,3,4,5,6,7,8,9
b表:id:2,3,4
c表:id:4,5,7先b,c表求合集得到的id为:2,3,4,5,7.。。
再拿b,c表的合集2,3,4,5,7 和a表的id为:2,3,4,5,7比较可用库存

解决方案 »

  1.   

    我写的sql只能得到a,b,c3个表的交集select a.id
     from a, b, c
     where a.id = b.id
     and a.id = c.id
    这样运算后根据上面的例子只有id=4的能显示出来。
    而我实际需求是2,3,4,5,7的显示出来。
      

  2.   

    实际SQL:
    --库存管理,调拨数量改变可用库存
    --库存管理,销售数量改变可用库存
    select c.sc_tt_stock_id,c.warehouse_name, c.product_no 
     from
        ( 
        select w.ware_id "仓库编号", w.ware_name "仓库名称", pi.product_no "货号", pi.product_name "商品名", s.stock_logic "页面显示可用库存" ,s.stock_now "页面显示实物库存",
               pt.transfer_num "已录入状态调拨数量", (s.stock_now-pt.transfer_num) "实际可用库存",
               w.sc_tm_warehouse_id wid, pi.sc_tm_product_info_id piid
         from sc_tt_stock s, sc_tt_product_transf pt, sc_tt_prd_trsf_info pti, sc_tm_product_info pi, sc_tm_warehouse w
         where 1=1
         and s.sc_tm_product_info_id = pi.sc_tm_product_info_id
         and pti.sc_tm_product_info_id = pi.sc_tm_product_info_id
         and pt.sc_tt_product_transf_id = pti.sc_tt_product_transf_id
         and s.sc_tm_warehouse_id = pt.transfer_out_ware_id
         and s.sc_tm_warehouse_id = w.sc_tm_warehouse_id
         and pt.transfer_status = '1'   --调拨单已录入状态)
        )a, 
        (
        select w.ware_id "仓库编号", w.ware_name "仓库名称", pi.product_no "货号", pi.product_name "商品名", s.stock_logic "页面显示可用库存" ,s.stock_now "页面显示实物库存",
               dsd.num "已提交销售数量", (s.stock_now-dsd.num) "实际可用库存",
               w.sc_tm_warehouse_id wid, pi.sc_tm_product_info_id piid
         from sc_tt_stock s, sc_tm_product_info pi, sc_tt_dealer_sale_info dsi, sc_tt_dealer_sale_dtl dsd, sc_tm_warehouse w
         where 1=1
         and s.sc_tm_product_info_id = pi.sc_tm_product_info_id
         and dsd.sc_tm_product_info_id = pi.sc_tm_product_info_id
         and s.sc_tm_warehouse_id = w.sc_tm_warehouse_id
         and dsi.sc_tm_warehouse_id = w.sc_tm_warehouse_id
         and dsd.sc_tt_dealer_sale_info_id = dsi.sc_tt_dealer_sale_info_id
         and dsi.status = '1'   --销售单已提交状态 
        )b, 
        
        sc_tt_stock c
    where 1=1
    and a.wid = c.sc_tm_warehouse_id
    and b.wid = c.sc_tm_warehouse_id
    and a.piid = c.sc_tm_product_info_id
    and b.piid = c.sc_tm_product_info_id
      

  3.   


    -----先吧b,c union all,然后使用a表minus求差集
    select id
      from a
    minus (select id
             from b
           union all
           select id from c)
      

  4.   


    -----b,c union all,然后外连接a表
    select aa.id from 
      (select id from b
       union all
       select id from c) aa
      left outer join a
      on aa.id=a.id
      

  5.   


    select a.id from a,(select id from b union select id from c)v
    where a.id=v.id
      

  6.   

    谢谢大家b表有一个调拨数量t_num, c表有一个销售数量s_num...
    两表合集后,怎么得到一个“调拨+销售”的总数量呢???/
      

  7.   

    select b.t_num+c.s_num
    from b,c
    where b.id = c.id
      

  8.   


    如上所示,b表有一个调拨数量t_num, c表有一个销售数量s_num。
    我不单要列出a.id,还要列出b.t_num, c.s_num, (b.t_num+c.s_num)
    这个怎么写。我把这些字段加上去后报错
      

  9.   

    select ,b.t_num,c.s_num,b.t_num+c.s_num
    from b,c
    where b.id = c.id
      

  10.   


    如上所示,b表有一个调拨数量t_num, c表有一个销售数量s_num。
    我不单要列出a.id,还要列出b.t_num, c.s_num, (b.t_num+c.s_num)
    这个怎么写。我把这些字段加上去后报错
      

  11.   


    我加上t_num, s_num后就报错啊。。求正确SQL。-----b,c union all,然后外连接a表
    select aa.*  from 
      (select b.id, b.t_num from b
       union all
       select c.id, c.s_num from c) aa
      left outer join a
      on aa.id=a.id--加上 b.t_num, c.s_num后报错。。显示不正确的列数。请问要怎样才能正确显示需要的t_num, s_num
      

  12.   


    --------这样嘛。。
    select aa.id, sum(t_num), sum(s_num), sum(t_sum + s_num)
      from (select b.id, b.t_num t_num, null s_num
              from b
            union all
            select c.id, null t_num, c.s_num from c) aa
      left outer join a on aa.id = a.id
     group by aa.id
      

  13.   

    没看下面一堆SQL,只看了第一帖里的说明
    说一下个人理解,看是不是楼主想要的数据库中,分别存储了 库存、调拨、销售 3 种不同的数据
    这些数据,从业务上来看,应当是有关联的,最终都会影响库存(至于可用、实际之间的区别,暂时不明)
    那么,从仓管角度来说,是要将这些影响直接生成一个  明细表,可以展示每种ID(物品)的情况,以便于实时管理。 对销售来说,则可以知道是否有货; 对采购与生产来说,则知道是否需要补货或加班生产。基于以上分析,则应当,以库存表为基础(仓库中所有物品),再 加上 实时发生的影响 - 调拨与销售, 产生最终的明细表即, select a.id
           ,sum(a.库存)      库存量
           ,sum(b.库存影响)  调拨量
           ,sum(c.库存影响)  销售量
           ,sum(a.库存) - sum(b.库存影响) - sum(c.库存影响) 结余量
       from 库存 a
         left join 调拨 b on a.id = b.id
         left join 销售 c on a.id = c.id
         group by a.id
      

  14.   


    select t1.id,
           nvl(b.t_num, 0) t_num,
           nvl(c.s_num, 0) s_num,
           (nvl(b.t_num, 0) + nvl(c.s_num, 0)) sum_all
      from (select id
              from b
            union
            select id from c) t1,
           b,
           c
     where t1.id = b.id(+)
       and t1.id = c.id(+)
      

  15.   

    个人理解,如果b,c表中的id是唯一的,那么就没必要用sum,直接先union,把b,c表中的存在的id查找出来,然后通过与b,c表分别作外关联,查找出需要的数据。如果还需要取a表中的数据,还可以通过id与a表关联查找出来
      

  16.   

    select t1.id,
           a.pname,
           nvl(b.t_num, 0) t_num,
           nvl(c.s_num, 0) s_num,
           (nvl(b.t_num, 0) + nvl(c.s_num, 0)) sum_all
      from (select id
              from b
            union
            select id from c) t1,
           a,
           b,
           c
     where t1.id = a.id
       and t1.id = b.id(+)
       and t1.id = c.id(+)
      

  17.   


    select s.sc_tm_warehouse_id "仓库编号", s.product_no "货号", s.stock_logic "页面显示可用库存", s.stock_now "页面显示实用库存",
            abc.tnum "调拨数量", abc.snum "销售数量",  (nvl(abc.tnum,0)+nvl(abc.snum,0)) "调拨销售总量",
            (s.stock_now - (nvl(abc.tnum,0)+nvl(abc.snum,0))) "实际可用库存"  
            --得到可用库存发生改变的库存编号,货号,可用库存,实用库存,调拨数量,销售数量,调拨销售总量,逻辑判断后的实际可用库存
      from (
             select ab.sid, sum(ab.tnum) tnum, sum(ab.snum) snum from  --得到可用库存发生改变的库存编号,调拨数量,销售数量
                  (
                        select  a.sid, a.tnum tnum, null snum from  --得到发生调拨的库存编号,调拨数量,销售数量(为空)
                                                  ( 
                                                  select pt.transfer_num tnum, s.sc_tt_stock_id sid
                                                   from sc_tt_stock s, sc_tt_product_transf pt, sc_tt_prd_trsf_info pti, sc_tm_product_info pi, sc_tm_warehouse w
                                                   where 1=1
                                                   and s.sc_tm_product_info_id = pi.sc_tm_product_info_id
                                                   and pti.sc_tm_product_info_id = pi.sc_tm_product_info_id
                                                   and pt.sc_tt_product_transf_id = pti.sc_tt_product_transf_id
                                                   and s.sc_tm_warehouse_id = pt.transfer_out_ware_id
                                                   and s.sc_tm_warehouse_id = w.sc_tm_warehouse_id
                                                   and pt.transfer_status = '1'   --调拨单已录入状态
                                                  )a  --得到调拨单改变可用库存的记录
                        union all
                        
                        select b.sid, null tnum, b.snum snum from (    ----得到发生销售的库存编号,调拨数量(为空),销售数量
                        
                                                   select dsd.num snum, s.sc_tt_stock_id sid
                                                   from sc_tt_stock s, sc_tm_product_info pi, sc_tt_dealer_sale_info dsi, sc_tt_dealer_sale_dtl dsd, sc_tm_warehouse w
                                                   where 1=1
                                                   and s.sc_tm_product_info_id = pi.sc_tm_product_info_id
                                                   and dsd.sc_tm_product_info_id = pi.sc_tm_product_info_id
                                                   and s.sc_tm_warehouse_id = w.sc_tm_warehouse_id
                                                   and dsi.sc_tm_warehouse_id = w.sc_tm_warehouse_id
                                                   and dsd.sc_tt_dealer_sale_info_id = dsi.sc_tt_dealer_sale_info_id
                                                   and dsi.status = '1'   --销售单已提交状态 
                                                  )b   ----得到销售单改变可用库存的记录
                       ) ab  --union all得到调拨/销售得到改变可用库存的记录
                    left outer join  sc_tt_stock c -- 和库存表产生交集,得到可用库存发生改变的记录
                    on ab.sid = c.sc_tt_stock_id
                    group by ab.sid
                ) abc, sc_tt_stock s
       where 1=1
       and abc.sid = s.sc_tt_stock_id
    谢谢各位朋友,写出来的SQL如上所述不知道怎么简化或性能变好点对不对还不太清楚。。只是执行时不报错。能正常出结果
      

  18.   

    前期对业务不熟弄的这么麻烦还union all ,group by .....
    其实很简单就三个表就好了。。select pi.product_no, pi.product_name,
           pi.sale_price, p.client_retail_price, p.max_price, p.min_price,
           ptd.max_make_up_rate*pi.sale_price/100, ptd.min_make_up_rate*pi.sale_price/100
    --select count(p.sc_tt_price_id)
        from sc_tt_price p, sc_tm_product_info pi, sc_tt_price_tmp_dtl ptd
        where (p.max_price <>ptd.max_make_up_rate*pi.sale_price/100 or p.min_price<>ptd.min_make_up_rate*pi.sale_price/100)
        and p.sc_tm_product_info_id = pi.sc_tm_product_info_id
        and p.sc_tt_price_template_id = ptd.sc_tt_price_template_id
        and pi.bland = '1'
        and pi.sc_tt_bak3 = ptd.dimesion_2         --中类
        and pi.grade = ptd.product_level           --档次
        and pi.uni_sale_price_flg= 0--非统一零售价商品
        and p.status in (1 ,2) --已生成或者已发布