高分求SQL语句,有a,b,c三张表求。。。

时间:2022-07-05 14:49:31
先介绍相关具体业务: 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比较可用库存

25 个解决方案

#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,c求交集呢??
也就是说找出既有调拨,又有销售的仓库某商品。

#7


引用 6 楼 cartonwang 的回复:
如何是b,c求交集呢??
也就是说找出既有调拨,又有销售的仓库某商品。

直接b.id = c.id

#8


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

#9


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

#10


引用 5 楼 djvfe 的回复:
SQL code

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


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

#11


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

#12


引用 10 楼 cartonwang 的回复:
引用 5 楼 djvfe 的回复:

SQL code

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


如上所示,b表有一个调拨数量t_num, c表有一个销售数量s_num。
我不单要列出a.id,还要列出b.t_num, c.s_num, (b.t_num+c.……


-----
请问怎么加上这些列。。

#13


引用 4 楼 gelyon 的回复:
SQL code

-----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


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

#14


引用 4 楼 gelyon 的回复:
SQL code

-----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


我加上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

#15



--------这样嘛。。
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

#16


没看下面一堆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

#17


引用 15 楼 oraclefans_ 的回复:
SQL code

--------这样嘛。。
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_nu……

同意 就是这样

#18



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(+)

#19


引用 15 楼 oraclefans_ 的回复:
SQL code

--------这样嘛。。
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.……


-----------
非常感谢。。。可用列出。。。
如果还要再加一个名称呢?就是该商品的名称。。在a表中有的。

#20


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

#21


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(+)

#22



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如上所述。。。不知道怎么简化或性能变好点。。。对不对还不太清楚。。只是执行时不报错。能正常出结果。。。

#23


看你写的差不多了,主要是不清楚逻辑,也没法给你简化,感觉你重复用到了一些表,但不清楚你为什么?

#24


前期对业务不熟。。。弄的这么麻烦。。。还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) --已生成或者已发布
    

#25


引用楼主 cartonwang 的回复:
先介绍相关具体业务: a,b,c三张表
a表是物理表:库存表。b,c表是库存表和其他业务(调拨,销售)产生的虚拟表

a表:
id logic now
编号 可用库存, 实际库存

b表:b表是列出经过调拨,使可用库存变化的表
c表:c表是列出经过销售,使可用库存变化的表


下面要列出可用库存改变(调拨/销售)的数据,并将该数据对库存表a表中的可用库存进行对比
也就是b,……
正解!

#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,c求交集呢??
也就是说找出既有调拨,又有销售的仓库某商品。

#7


引用 6 楼 cartonwang 的回复:
如何是b,c求交集呢??
也就是说找出既有调拨,又有销售的仓库某商品。

直接b.id = c.id

#8


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

#9


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

#10


引用 5 楼 djvfe 的回复:
SQL code

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


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

#11


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

#12


引用 10 楼 cartonwang 的回复:
引用 5 楼 djvfe 的回复:

SQL code

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


如上所示,b表有一个调拨数量t_num, c表有一个销售数量s_num。
我不单要列出a.id,还要列出b.t_num, c.s_num, (b.t_num+c.……


-----
请问怎么加上这些列。。

#13


引用 4 楼 gelyon 的回复:
SQL code

-----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


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

#14


引用 4 楼 gelyon 的回复:
SQL code

-----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


我加上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

#15



--------这样嘛。。
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

#16


没看下面一堆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

#17


引用 15 楼 oraclefans_ 的回复:
SQL code

--------这样嘛。。
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_nu……

同意 就是这样

#18



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(+)

#19


引用 15 楼 oraclefans_ 的回复:
SQL code

--------这样嘛。。
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.……


-----------
非常感谢。。。可用列出。。。
如果还要再加一个名称呢?就是该商品的名称。。在a表中有的。

#20


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

#21


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(+)

#22



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如上所述。。。不知道怎么简化或性能变好点。。。对不对还不太清楚。。只是执行时不报错。能正常出结果。。。

#23


看你写的差不多了,主要是不清楚逻辑,也没法给你简化,感觉你重复用到了一些表,但不清楚你为什么?

#24


前期对业务不熟。。。弄的这么麻烦。。。还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) --已生成或者已发布
    

#25


引用楼主 cartonwang 的回复:
先介绍相关具体业务: a,b,c三张表
a表是物理表:库存表。b,c表是库存表和其他业务(调拨,销售)产生的虚拟表

a表:
id logic now
编号 可用库存, 实际库存

b表:b表是列出经过调拨,使可用库存变化的表
c表:c表是列出经过销售,使可用库存变化的表


下面要列出可用库存改变(调拨/销售)的数据,并将该数据对库存表a表中的可用库存进行对比
也就是b,……
正解!