sql 数量的计算

MrYangkang 2013-05-06 04:12:25
--物料表
if exists(select * from sysobjects where name= 'wlinfo')
drop table wlinfo
go
create table wlinfo
(
wlcode nvarchar(20) primary key,
wltype nvarchar(20),
wlname nvarchar(20),
wiunit nvarchar(20)
)
go
insert into wlinfo
select '001','成品','台式电脑','台' union all
select '001-001','半成品','显示器','台' union all
select '001-002','半成品','主机','台' union all

select '001-002-001','材料','CPU','个' union all
select '001-002-002','材料','主板','个' union all
select '001-002-003','材料','电源','个' union all
select '001-002-004','材料','内存','个'
go
--关系表
if exists(select * from sysobjects where name= 'relation')
drop table relation
go
create table relation
(
id int primary key identity(1,1),
wlcode nvarchar(20),
wlcode1 nvarchar(20)
)
insert into relation
select '001','001-001' union all
select '001','001-002' union all
select '001-002','001-002-001' union all
select '001-002','001-002-002' union all
select '001-002','001-002-003' union all
select '001-002','001-002-004'
go
--库存表
if exists(select * from sysobjects where name= 'wlinWM')
drop table wlinWM
go
create table wlinWM
(
id int primary key identity(1,1),
wlcode nvarchar(20),
wlnumber int
)
go
insert into wlinWM
select '001-001',2 union all
select '001-002-001',2 union all
select '001-002-002',3 union all
select '001-002-003',4 union all
select '001-002-004',5
go
select * from wlinfo
select * from relation
select * from wlinWM
--听题,以上都是测试数据,如1台电脑= 1个显示器+1个主机
--1个主机= 1个CPU+1个主板+1个电源+1个内存
--现在
求:
1:半成品 数量 剩余材料 数量
2:成品 数量 半成品 数量 剩余材料 数量
...全文
286 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 9 楼 tntzbzc 的回复:
[quote=引用 7 楼 ZaoLianBuXiQi 的回复:] 版主,求解答
同志们,不要告诉LZ怎么做 除非LZ告诉我们他公司在哪~~~!!!! http://bbs.csdn.net/topics/390452586[/quote]
MrYangkang 2013-05-09
  • 打赏
  • 举报
回复
引用 7 楼 ZaoLianBuXiQi 的回复:
版主,求解答
版主呢?
撸大湿 2013-05-09
  • 打赏
  • 举报
回复
引用 7 楼 ZaoLianBuXiQi 的回复:
版主,求解答
同志们,不要告诉LZ怎么做 除非LZ告诉我们他公司在哪~~~!!!! http://bbs.csdn.net/topics/390452586
MrYangkang 2013-05-08
  • 打赏
  • 举报
回复
版主,求解答
daiyueqiang2045 2013-05-07
  • 打赏
  • 举报
回复
引用 5 楼 ZaoLianBuXiQi 的回复:
[quote=引用 3 楼 daiyueqiang 的回复:]

with cte1 --半成品数量
as
(
select 
半成品=t2.wlcode,
半成品数量=MIN(t1.wlnumber)
from
wlinWM t1 
inner join wlinfo t2 on substring(t1.wlcode,0,8)=t2.wlcode
group by t2.wlcode
),
cte2 -- 剩余材料 数量
as
(
	select 
	剩余材料=t1.wlcode
	,剩余材料数量=t1.wlnumber-t2.半成品数量
	from
	wlinWM t1
	inner join cte1 t2 on substring(t1.wlcode,0,8)=t2.半成品
	where
	t1.wlnumber>t2.半成品数量
),
cte3 --成品 数量
as
(
	select 
	成品=substring(t1.半成品,0,4),
	成品数量=MIN(t1.半成品数量)
	from
	cte1 t1
	group by substring(t1.半成品,0,4)
)
select * from cte1 --半成品
union all
select * from cte2 --剩余材料
union all
select * from cte3 --成品
考虑问题不全,我给的数据是测试数据,不能取最小然后分组算半成品,因为半成品由哪些材料组成一个半成品,如果我其中有一个或多个没有组成半成品的材料(比如数据中没有CPU材料),那半成品(主机)是一个都没,如果半成品都没,那成品更没[/quote] 我明白lz的意思:如1台电脑= 1个显示器+1个主机 --1个主机= 1个CPU+1个主板+1个电源+1个内存 如果换成这个1个主机= 1个CPU+1个主板+1个电源+2个内存+4个硬盘+(数量不固定)材料 的话, 这个是有难度的。 都是1:1的比例是比较容易的。 半成品:
select 
半成品=t2.wlcode,
半成品数量=MIN(t1.wlnumber)
from
wlinWM t1 
inner join relation t2 on substring(t1.wlcode,0,8)=t2.wlcode
group by t2.wlcode
having COUNT(t1.wlcode)=COUNT(t2.wlcode1)--零件的数量相同
MrYangkang 2013-05-06
  • 打赏
  • 举报
回复
引用 3 楼 daiyueqiang 的回复:

with cte1 --半成品数量
as
(
select 
半成品=t2.wlcode,
半成品数量=MIN(t1.wlnumber)
from
wlinWM t1 
inner join wlinfo t2 on substring(t1.wlcode,0,8)=t2.wlcode
group by t2.wlcode
),
cte2 -- 剩余材料 数量
as
(
	select 
	剩余材料=t1.wlcode
	,剩余材料数量=t1.wlnumber-t2.半成品数量
	from
	wlinWM t1
	inner join cte1 t2 on substring(t1.wlcode,0,8)=t2.半成品
	where
	t1.wlnumber>t2.半成品数量
),
cte3 --成品 数量
as
(
	select 
	成品=substring(t1.半成品,0,4),
	成品数量=MIN(t1.半成品数量)
	from
	cte1 t1
	group by substring(t1.半成品,0,4)
)
select * from cte1 --半成品
union all
select * from cte2 --剩余材料
union all
select * from cte3 --成品
考虑问题不全,我给的数据是测试数据,不能取最小然后分组算半成品,因为半成品由哪些材料组成一个半成品,如果我其中有一个或多个没有组成半成品的材料(比如数据中没有CPU材料),那半成品(主机)是一个都没,如果半成品都没,那成品更没
MrYangkang 2013-05-06
  • 打赏
  • 举报
回复
引用 2 楼 maco_wang 的回复:
就目前的测试数据,你想要什么样的结果,给个示例看看...
半成品编号 半成品名称 半成品数量 剩余材料编号 剩余材料名称 剩余数量 001-001 显示器 2 null null 0 001-002 主机 2 001-002-001 CPU 0 null null 0 001-002-002 主板 1 null null 0 001-002-003 电源 2 null null 0 001-002-004 内存 3 ,第二个类似 也可以这样 物料编号 物料名称 物料类型 数量 001-001 显示器 半成品 2 001-002 主机 半成品 2 001-002-001 CPU 材料 0 001-002-002 主板 材料 1 001-002-003 电源 材料 2 001-002-002 内存 材料 3 第二个这计算成品后有剩余多少半成品和多少材料 麻烦大师们,两种都写,谢谢
daiyueqiang2045 2013-05-06
  • 打赏
  • 举报
回复

with cte1 --半成品数量
as
(
select 
半成品=t2.wlcode,
半成品数量=MIN(t1.wlnumber)
from
wlinWM t1 
inner join wlinfo t2 on substring(t1.wlcode,0,8)=t2.wlcode
group by t2.wlcode
),
cte2 -- 剩余材料 数量
as
(
	select 
	剩余材料=t1.wlcode
	,剩余材料数量=t1.wlnumber-t2.半成品数量
	from
	wlinWM t1
	inner join cte1 t2 on substring(t1.wlcode,0,8)=t2.半成品
	where
	t1.wlnumber>t2.半成品数量
),
cte3 --成品 数量
as
(
	select 
	成品=substring(t1.半成品,0,4),
	成品数量=MIN(t1.半成品数量)
	from
	cte1 t1
	group by substring(t1.半成品,0,4)
)
select * from cte1 --半成品
union all
select * from cte2 --剩余材料
union all
select * from cte3 --成品
叶子 2013-05-06
  • 打赏
  • 举报
回复
就目前的测试数据,你想要什么样的结果,给个示例看看...
叶子 2013-05-06
  • 打赏
  • 举报
回复
我先问一下,是要这样的结果吗?
/*
半成品数量       剩余材料数量
----------- -----------
4           6

成品数量        半成品数量
----------- -----------
2           6
*/

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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