| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1051 人关注过本帖
标题:SQL 神题生产排程--求解【新手勿进】
取消只看楼主 加入收藏
lzm
Rank: 1
来 自:广东
等 级:新手上路
帖 子:156
专家分:0
注 册:2007-9-2
结帖率:33.33%
收藏
已结贴  问题点数:50 回复次数:1 
SQL 神题生产排程--求解【新手勿进】
create database Roni_temp
use Roni_temp
go

/*drop table pland_det
drop table plan_mstr*/
create table plan_mstr
(
    PNO_ID          int      not null,                     /*生产单号*/
    pqty            int      not null,                     /*待产量*/
    dayqty          int      not null,                     /*机器日产量*/
    plan_line       int      not null,                     /*生产次序*/
    constraint pk_plan_mstr primary key (PNO_ID)
)
create table pland_det
(
    day_line        int      not null,                     /*生产次序*/
    PNO_ID          int      not null,                     /*生产单号*/
    Aqty            int      not null,                     /*安排产量*/
    constraint pk_pland_det FOREIGN KEY (PNO_ID) REFERENCES plan_mstr(PNO_ID)
)
insert into plan_mstr (PNO_ID,pqty,dayqty,plan_line) values (001,100,40,1)
insert into plan_mstr (PNO_ID,pqty,dayqty,plan_line) values (002,30,20,2)
insert into plan_mstr (PNO_ID,pqty,dayqty,plan_line) values (003,20,10,3)

生产排程表
PNO_ID(生产单号)   PQty(待产量)   DayQty(机器日产量)  plan_line(生产次序)
 001              100             40                     1
 002              30              20                     2
 003              20              10                     3
 
想生成如下的推断生产计划表2:
 Day_line(生产次序第几天) PNO_ID(生产单号)  AQty(安排产量)
 1                         001                40
 1                         002                 0
 1                         003                 0
 2                         001                40
 2                         002                 0
 2                         003                 0
 3                         001                20
 3                         002                10
 3                         003                0
 4                         002                20
 4                         003                0
 5                         003                10
 6                         003                10

凡是到某天还没生产完成的单(包括生产了一部分的或者还没开始生产的),
那天的数据都要包括这些单号,生产完成的单则不必显示,如果该单当天按推断不会生产,
则AQty(安排产量)为0,请大家看看第3天的数据,该天001单剩下20个没做,机器对001单的日产量是40个,
那么机器能够生产完001单之后还剩下半天时间,按照生产次序,001单完成之后是002单,002单要生产30个,
机器对002单的日产量是20个,即是说,第3天还有半天时间可以安排生产002单,这半天时间能够生产002单是10个,
002单还剩20个,这20个刚好第4天可以生产完,那么第5天就可以开始生产003单.


求解,谁能用SQL按生产排程表把生产计划表推算出来?
搜索更多相关主题的帖子: create primary database null 
2014-06-12 14:36
lzm
Rank: 1
来 自:广东
等 级:新手上路
帖 子:156
专家分:0
注 册:2007-9-2
收藏
得分:0 
已经找到相关解决方案,分享一下,如下:
/*
--以前看到的一个题,下面表 @t有三个字段,PNO表示产品编号,PQTY表示需要生产的总数,
DAYQTY表示相关产品最大日生产量,排程的规则就是按PID字段排序来生产,只有生产完了最前面的产品再生产下面的
*/

declare @t Table(PNO varchar(20),PQty int,DayQty int,PID int)
insert @t select '001',100,40,1
union all select '002',40,20,2
union all select '003',20,10,3
union all select '004',75,30,4
union all select '005',60,20,5

/*
--以下是代码,生产日历表自己加的,思路是这样的,我先算出,每一个产品的生产总天数,
产品开始生产的日期,产品生产结束日期,那个加A,B分开主要是有的产品生产的开始日期是从一天中的某个时段开时,
这个有点麻烦,在SQL中处理小数又不好处理。下面的写法性能看样子也好不到哪里去了,也没有考虑,只是为了达到要求.
*/

declare @cal Table(Day int) --生产日历
insert @cal select 1
union all select 2
union all select 3
union all select 4
union all select 5
union all select 6
union all select 7
union all select 8
union all select 9
union all select 10
union all select 11
union all select 12

 


select PNO,PQty,DayQty,PID,[Day],DayNeed as 生产总天数,BDayA 开始生产日期A,BDayB 开始生产日期B,FDay 结束生产日期,
(case when Day>BDayB and Day<FDay then DayQty
when Day=BDayB and Floor(BDayA)=BDayA then DayQty
when Day=BDayB and BDayA>Floor(BDayA) then (Day-BDayA)*DayQty
   when Day=FDay then (DayNeed-(Day-BDayA-(Case when ceiling(BDayA)>BDayA then 1 else 0 end))) *DayQty
else 0 end) 日生产量
from
(
select PNO,PQty,DayQTy,PID,[Day],DayNeed,BeginDay BDayA,
ceiling(BeginDay) as BDayB,
(case when ceiling(BeginDay)>BeginDay then ceiling(BeginDay+DayNeed) else ceiling(beginDay+DayNeed)-1 end) FDay
from
(                                                                                                   
select A1.PNO,A1.PQty,A1.DayQty,A1.PID,A2.Day,(A1.PQty/cast(A1.DayQty as Decimal(5,1))) as DayNeed,
(select Isnull(sum(PQty/cast(DayQty as Decimal(2,0))),1) from @t where PID<A1.PID) as BeginDay
from @t as A1 cross join @Cal as A2) as Z where (case when ceiling(BeginDay)>BeginDay then ceiling(BeginDay+DayNeed) else ceiling(beginDay+DayNeed)-1 end)>=Day
) as R order by Day,PNO
2014-12-02 14:29
快速回复:SQL 神题生产排程--求解【新手勿进】
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017517 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved