SQL中的3个表组合计算

wangxiaofeiwuqiao 2011-07-21 02:31:56
有表view_22:

PARENT LOCATION STOCK_QTY
#2098184-16050 CSP3 500
20-03304-01010 CSP3 1600

表view_11:

ITEM_CODE CTM_ITEM QTY_RATIO CTM_NAME
21-98184-00010 998877 0.5 胶料001
22-98184-01030 998877 0.6 胶料681
21-03304-00010 998877 0.8 胶料004
22-03304-00030 998877 1.5 胶料424

表BOM1:

PARENT ITEM_CODE QTY_PER(指ITEM_CODE的重量) BOM_UNIT
97-94726-03010 90-94726-03010 4.6 PCS
90-94726-03010 #2098184-16050 8.8 PCS
#2098184-16050 21-98184-00010 1.6 G
#2098184-16050 22-98184-01030 9.8 G
97-03304-14010 91-03304-14010 1.5 PCS
91-03304-14010 90-03304-14010 7.5 PCS
90-03304-14010 20-03304-14010 0.5 PCS
20-03304-14010 21-03304-00010 1.6 G
20-03304-14010 22-03304-00030 0.8 G

我想要的结果:(来自表view_22的ITEM_CODE,只要它的在BOM1下面有下层,就要拆分到最低层)

PARENT ITEM_CODE LOCATION P_QTY STOCK_QTY QTY_RATIO CTM_QTY BOM_UNIT
#2098184-16050 21-98184-00010 CSP3 500 800 0.5 400 G
#2098184-16050 22-98184-01030 CSP3 500 4900 0.6 2940 G
20-03304-14010 21-03304-00010 CSP3 1600 2560 0.8 2048 G
20-03304-14010 22-03304-00030 CSP3 1600 1280 1.5 1920 G
其中P_QTY=view_22中的STOCK_QTY, STOCK_QTY=P_QTY*BOM1对应QTY_PER,QTY_RATIO来自view_11中对应的ITEM_CODE,CTM_QTY=STOCK_QTY*QTY_RATIO;

要点:根据view_22中的PARENT在BOM1表中查找,如果能找到ITEM_CODE,并且该改ITEM_CODE也出现在view_11中,那么就进行计算。
数据库环境:sql 2000
类似帖子 :http://topic.csdn.net/u/20110720/14/ea256903-2816-4057-a3bc-4f2506759575.html
...全文
981 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
lgwinym 2011-07-25
  • 打赏
  • 举报
回复
kanlouzhutouxiang
懒虫虫 2011-07-25
  • 打赏
  • 举报
回复
学习一下,用到基本的信息表类!
PatrickCao 2011-07-25
  • 打赏
  • 举报
回复
园丁小三?
nice to meet you.
q260401998 2011-07-23
  • 打赏
  • 举报
回复
贴子很火啊,顶一下,记录下来了
净丑 2011-07-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 net_08 的回复:]

来看楼主的图像的。
[/Quote]
支持!
wangxiaofeiwuqiao 2011-07-22
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 cd731107 的回复:]
引用 17 楼 wangxiaofeiwuqiao 的回复:
引用 14 楼 wangxiaofeiwuqiao 的回复:
引用 13 楼 cd731107 的回复:
SQL code
--替小三回复一下她的菜

--楼主提供的建表数据与显示的各表内容还有少量差误,下面已修正

create table view_22(PARENT varchar(50),LOCATION var……
[/Quote]
测试通过,结贴
cd731107 2011-07-22
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 wangxiaofeiwuqiao 的回复:]
引用 14 楼 wangxiaofeiwuqiao 的回复:
引用 13 楼 cd731107 的回复:
SQL code
--替小三回复一下她的菜

--楼主提供的建表数据与显示的各表内容还有少量差误,下面已修正

create table view_22(PARENT varchar(50),LOCATION varchar(50),STOCK_QTY float)
inser……
[/Quote]
是的
wangxiaofeiwuqiao 2011-07-22
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 wangxiaofeiwuqiao 的回复:]
引用 13 楼 cd731107 的回复:
SQL code
--替小三回复一下她的菜

--楼主提供的建表数据与显示的各表内容还有少量差误,下面已修正

create table view_22(PARENT varchar(50),LOCATION varchar(50),STOCK_QTY float)
insert into view_22(PARENT,LOCATION,S……
[/Quote]

测试OK,是不是每次都要创建临时表?然后运行后再删除?因为BOM1的数据经常变化的,要取最新的数据。
wangxiaofeiwuqiao 2011-07-22
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 cd731107 的回复:]
问小三吧
[/Quote]
,我测试下先
cd731107 2011-07-22
  • 打赏
  • 举报
回复
问小三吧
wangxiaofeiwuqiao 2011-07-22
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 cd731107 的回复:]
SQL code
--替小三回复一下她的菜

--楼主提供的建表数据与显示的各表内容还有少量差误,下面已修正

create table view_22(PARENT varchar(50),LOCATION varchar(50),STOCK_QTY float)
insert into view_22(PARENT,LOCATION,STOCK_QTY)
values('#20……
[/Quote]
非常感谢,再问一下,我是把所有的SQL放到网页里面的,下面的这部分要放哪里?

--设置@level表示bom的层次
declare @level int
set @level = 1
--整个BOM1放入临时表,并设为第一层
select *,@level as level into #BOM1 from BOM1
--循环找到各层子结点
while @@ROWCOUNT > 0
begin
set @level = @level + 1
--将各层子结点插入到临时表
insert into #BOM1 select b.PARENT,a.ITEM_CODE,a.QTY_PER,a.BOM_UNIT,@level
from BOM1 a,#BOM1 b
where a.PARENT = b.ITEM_CODE and b.level = @level - 1
end
cd731107 2011-07-22
  • 打赏
  • 举报
回复
--替小三回复一下她的菜

--楼主提供的建表数据与显示的各表内容还有少量差误,下面已修正

create table view_22(PARENT varchar(50),LOCATION varchar(50),STOCK_QTY float)
insert into view_22(PARENT,LOCATION,STOCK_QTY)
values('#2098184-16050','CSP3','500')
insert into view_22(PARENT,LOCATION,STOCK_QTY)
values('20-03304-14010','CSP3','1600')


create table view_11
(ITEM_CODE varchar(50),CTM_ITEM varchar(50),QTY_RATIO float,CTM_NAME varchar(50))
insert into view_11(ITEM_CODE,CTM_ITEM,QTY_RATIO,CTM_NAME)
values('21-98184-00010','998877','0.5','胶料001')
insert into view_11(ITEM_CODE,CTM_ITEM,QTY_RATIO,CTM_NAME)
values('22-98184-01030','998877','0.6','胶料681')
insert into view_11(ITEM_CODE,CTM_ITEM,QTY_RATIO,CTM_NAME)
values('21-03304-00010','998877','0.8','胶料004')
insert into view_11(ITEM_CODE,CTM_ITEM,QTY_RATIO,CTM_NAME)
values('22-03304-00030','998877','1.5','胶料424')


Create table BOM1(PARENT varchar(50),ITEM_CODE varchar(50),
QTY_PER float,BOM_UNIT varchar(50))
insert into BOM1(PARENT,ITEM_CODE,QTY_PER,BOM_UNIT)
values('97-94726-03010','90-94726-03010','4.6','PCS')
insert into BOM1(PARENT,ITEM_CODE,QTY_PER,BOM_UNIT)
values('90-94726-03010','#2098184-16050','8.8','PCS')
insert into BOM1(PARENT,ITEM_CODE,QTY_PER,BOM_UNIT)
values('#2098184-16050','21-98184-00010','1.6','G')
insert into BOM1(PARENT,ITEM_CODE,QTY_PER,BOM_UNIT)
values('#2098184-16050','22-98184-01030','9.8','G')
insert into BOM1(PARENT,ITEM_CODE,QTY_PER,BOM_UNIT)
values('97-03304-14010','91-03304-14010','1.5','PCS')
insert into BOM1(PARENT,ITEM_CODE,QTY_PER,BOM_UNIT)
values('91-03304-14010','90-03304-14010','7.5','PCS')
insert into BOM1(PARENT,ITEM_CODE,QTY_PER,BOM_UNIT)
values('90-03304-14010','20-03304-14010','0.5','PCS')
insert into BOM1(PARENT,ITEM_CODE,QTY_PER,BOM_UNIT)
values('20-03304-14010','21-03304-00010','1.6','G')
insert into BOM1(PARENT,ITEM_CODE,QTY_PER,BOM_UNIT)
values('20-03304-14010','22-03304-00030','0.8','G')


--设置@level表示bom的层次
declare @level int
set @level = 1
--整个BOM1放入临时表,并设为第一层
select *,@level as level into #BOM1 from BOM1
--循环找到各层子结点
while @@ROWCOUNT > 0
begin
set @level = @level + 1
--将各层子结点插入到临时表
insert into #BOM1 select b.PARENT,a.ITEM_CODE,a.QTY_PER,a.BOM_UNIT,@level
from BOM1 a,#BOM1 b
where a.PARENT = b.ITEM_CODE and b.level = @level - 1
end


--第一种算法:所有各层结点的计算,包括中间结点(枝干和叶子)
select a.PARENT,b.item_code,a.LOCATION,a.STOCK_QTY as P_QTY,a.STOCK_QTY*b.QTY_PER as STOCK_QTY,
cast(c.QTY_RATIO as numeric(8,1))QTY_RATIO,a.STOCK_QTY*b.QTY_PER*c.QTY_RATIO as CTM_QTY,b.BOM_UNIT
from view_22 a,#BOM1 b,view_11 c where a.PARENT=b.PARENT and b.item_code=c.item_code

--------------------------------------------------------------------------------------------------

/*
第二种算法:末级结点的计算,不包括中间结点(只包括叶子)
这里用select * from #BOM1 where ITEM_CODE not in (select PARENT from #BOM1)代替了#BOM1
上句的意思是过滤掉那些既是子结点又是父结点的中间结点 
*/
select a.PARENT,b.item_code,a.LOCATION,a.STOCK_QTY as P_QTY,a.STOCK_QTY*b.QTY_PER as STOCK_QTY,
cast(c.QTY_RATIO as numeric(8,1))QTY_RATIO,a.STOCK_QTY*b.QTY_PER*c.QTY_RATIO as CTM_QTY,b.BOM_UNIT
from view_22 a,(select * from #BOM1 where ITEM_CODE not in (select PARENT from #BOM1)) b,view_11 c
where a.PARENT=b.PARENT and b.item_code=c.item_code

--------------------------------------------------------------------------------------------------
drop table view_22,view_11,BOM1,#BOM1

/*
PARENT ITEM_CODE LOCATION P_QTY STOCK_QTY QTY_RATIO CTM_QTY BOM_UNIT
#2098184-16050 21-98184-00010 CSP3 500 800 0.5 400 G
#2098184-16050 22-98184-01030 CSP3 500 4900 0.6 2940 G
20-03304-14010 21-03304-00010 CSP3 1600 2560 0.8 2048 G
20-03304-14010 22-03304-00030 CSP3 1600 1280 1.5 1920 G
*/
wangxiaofeiwuqiao 2011-07-21
  • 打赏
  • 举报
回复

PARENT LOCATION STOCK_QTY
#2098184-16050 CSP3 500
20-03304-01010 CSP3 1600

这里的也可能是90,90下面是20,20下面是21和22,要拆到最低层。
没人能帮看看么
wangxiaofeiwuqiao 2011-07-21
  • 打赏
  • 举报
回复
View_11的测试数据:

create table view_11
(ITEM_CODE varchar(50),CTM_ITEM varchar(50),QTY_RATIO float,CTM_NAME varchar(50))
insert into view_11(ITEM_CODE,CTM_ITEM,QTY_RATIO,CTM_NAME)
values('21-98184-00010','998877','0.5','胶料001')
insert into view_11(ITEM_CODE,CTM_ITEM,QTY_RATIO,CTM_NAME)
values('22-98184-01030','998877','0.6','胶料681')
insert into view_11(ITEM_CODE,CTM_ITEM,QTY_RATIO,CTM_NAME)
values('21-03304-00010','998877','0.8','胶料004')
insert into view_11(ITEM_CODE,CTM_ITEM,QTY_RATIO,CTM_NAME)
values('22-03304-00030','998877','1.5','胶料424')
wangxiaofeiwuqiao 2011-07-21
  • 打赏
  • 举报
回复
修改一个数据,搞错了View_22

PARENT LOCATION STOCK_QTY
#2098184-16050 CSP3 500
20-03304-14010 CSP3 1600

它的测试数据:

create table view_22(PARENT varchar(50),LOCATION varchar(50),STOCK_QTY float)
insert into view_22(PARENT,LOCATION,STOCK_QTY)
values('#2098184-16050','CSP3','500')
insert into view_22(PARENT,LOCATION,STOCK_QTY)
values('20-03304-14010','CSP3','1600')
guguda2008 2011-07-21
  • 打赏
  • 举报
回复
正好有空,看一下
wangxiaofeiwuqiao 2011-07-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 acherat 的回复:]
今天不在状态了,感冒发烧。。。。在数星星! 好晕。
[/Quote]
哦,不好意思。那注意休息吧。多喝水哦
AcHerat 元老 2011-07-21
  • 打赏
  • 举报
回复
今天不在状态了,感冒发烧。。。。在数星星! 好晕。
wangxiaofeiwuqiao 2011-07-21
  • 打赏
  • 举报
回复
没人帮帮我看看么
zhouxingyu896 2011-07-21
  • 打赏
  • 举报
回复
帮顶
帮顶
学习
学习
加载更多回复(4)

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧