求一个先进先出的SQL语句。

ykwang 2011-09-13 09:45:10
有两个表A表,B表

A表
下单日期 产品型号 下单数量
2011-09-01 AT001 10
2011-09-05 AT001 20
2011-09-13 AT001 30
2011-09-02 AT002 20
2011-09-13 AT002 30

B表
入库日期 产品型号 入库数量
2011-09-11 AT001 12
2011-09-13 AT001 6
2011-09-13 AT002 28

需要返回结果:

下单日期 产品型号 已下单未入库数量
2011-09-05 AT001 12
2011-09-13 AT001 30
2011-09-13 AT002 22

是这样的要求:第一条返回结果中的 12个数值是这样算出来的,先统计入库表,统计出来AT001总共是 18个,然后按A表的下单数值比对,相当于2011-09-01的AT001的10个数量已经完成。2011-09-05 的AT001本有20个再减去完成的 8个,剩余12个。2011-09-13的30个还没有完成。 所有显示出来
AT002 产品也是一样,总共入库22个,减去第一个下单20个,剩余8个,2011-09-13 单的30个减去8个,等于22个。

条件:1、以日期为准的先后顺序
2、同一个日期只会有一个产品编号。

谢谢

...全文
138 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ykwang 2011-09-14
  • 打赏
  • 举报
回复
这个查询语句的目的是: 查询出哪些订单还没有入库,入库日期不用管它。把入库的数据统计起来,然后减去订单的下单数据,把哪些订单没有入库的记录给显示出来。
--小F-- 2011-09-13
  • 打赏
  • 举报
回复
给个例子你先看看

--库存先进先出简单例子:

create table t(
id int identity(1,1),
name varchar(50),--商品名称
j int, --入库数量
c int, --出库数量
jdate datetime --入库时间
)
insert into t(name,j,c,jdate) select 'A',100,0,'2007-12-01'
insert into t(name,j,c,jdate) select 'A',200,0,'2008-01-07'
insert into t(name,j,c,jdate) select 'B',320,0,'2007-12-21'
insert into t(name,j,c,jdate) select 'A',100,0,'2008-01-15'
insert into t(name,j,c,jdate) select 'B',90,0,'2008-02-03'
insert into t(name,j,c,jdate) select 'A',460,0,'2008-02-01'
insert into t(name,j,c,jdate) select 'A',510,0,'2008-03-01'
go



create proc wsp
@name varchar(50),--商品名称
@cost int --销售量
as
--先得出该货物的库存是否够
declare @spare float --剩余库存
select @spare=sum(j)-sum(c) from t where name=@name
if(@spare>=@cost)
begin
--根据入库日期采用先进先出原则对货物的库存进行处理
update t set c=
case when (select @cost-isnull(sum(j),0)+isnull(sum(c),0) from t where name=@name and jdate<=a.jdate and j!=c)>=0
then a.j
else
case when (select @cost-isnull(sum(j),0)+isnull(sum(c),0) from t where name=@name and jdate<a.jdate and j!=c)<0 then 0
else (select @cost-isnull(sum(j),0)+isnull(sum(c),0)+a.c from t where name=@name and jdate<a.jdate and j!=c)
end
end
from t a where name=@name and j!=c
end
else
raiserror('库存不足',16,1)
return
go


--测试:

exec wsp @name='A',@cost=180
select * from t


--drop table t
--drop proc wsp
-晴天 2011-09-13
  • 打赏
  • 举报
回复
1.不可能得到楼主的数据,5号还没有入库,12哪来的?
2.产品2入库28个,不是22个@!
3.同一个日期只有一个产品编号?看看你要的结果...

以入库为基础统计:
create table tbA(下单日期 datetime,产品型号 nvarchar(10),下单数量 int)
insert into tbA select '2011-09-01','AT001',10
insert into tbA select '2011-09-05','AT001',20
insert into tbA select '2011-09-13','AT001',30
insert into tbA select '2011-09-02','AT002',20
insert into tbA select '2011-09-13','AT002',30
create table tbB(入库日期 datetime,产品型号 nvarchar(10),入库数量 int)
insert into tbB select '2011-09-11','AT001',12
insert into tbB select '2011-09-13','AT001',6
insert into tbB select '2011-09-13','AT002',28
go
select 入库日期,产品型号,
(select sum(下单数量) from tba where 产品型号=b.产品型号 and 下单日期<=b.入库日期)-
(select sum(入库数量) from tbb where 产品型号=b.产品型号 and 入库日期<=b.入库日期)下单未入库 from tbb b
/*
入库日期 产品型号 下单未入库
----------------------- ---------- -----------
2011-09-11 00:00:00.000 AT001 18
2011-09-13 00:00:00.000 AT001 42
2011-09-13 00:00:00.000 AT002 22

(3 行受影响)

*/
go
drop table tba,tbb
更优更快 人工智能自动SQL优化----------http://www.sina.com.cn 2001/12/12 17:48 中国电脑教育报文/SQL爱好者  所谓SQL,就是指Structured Query Language(结构化查询语言),它是目前使用最广泛的数据库语言,用来和数据库打交道,从数据库中得到用户需要的数据。但是要想熟练使用SQL语句,也不是一件简单的事,有些语句使用起来也比较麻烦。如果我们对SQL语句进行优化,那么用户使用起来 就会方便许多。  简单来说,SQL语句的优化就是将性能低下的SQL语句转换成达到同样目的的性能优异的SQL语句。人工智能自动SQL优化就是使用人工智能技术,自动对SQL语句进行重写,找到性能最好的等效SQL语句。  人工智能自动SQL 优化  随着人工智能技术的发展和在数据库优化领域应用的深入,在20世纪90年代末终于出现了突破性的进展——人工智能自动SQL优化。目前在商用数据库领域LECCO TechnologyLimited(灵高公司)拥有该技术并提供使用该技术的自动优化产品——LECCO SQL Expert,其支持Oracle、Sybase、MS SQLServer和IBMDB2数据库平台。该产品针对数据库应用的开发和维护阶段提供了几个特别的模块:SQL语法优化器、PL/SQL集成化开发调试环境(IDE)、扫描器、数据库监视器等。图1 人工智能自动SQL优化示意图  其核心模块之一“SQL语法优化器”的工作原理大致如下(如图1):  一条源SQL语句输入→“人工智能反馈式搜索引擎”对输入的SQL语句结合检测到的数据库结构和索引进行重写,产生N条等效的SQL语句输出→产生的N条等效SQL语句再送入“人工智能反馈式搜索引擎”进行重写,直至无法产生新的输出或搜索限额满→对 输出的SQL语句进行过滤,选出具有不同执行计划的SQL语句(即不同的执行效率)→对得到的SQL语句进行批量测试,找出性能最好的SQL语句。图2 优化前的SQL语句  自动优化实例  假设我们从源代码中抽取出这条SQL语句(如图2):  SELECTCOUNT(*)FROMEMPLOY-EE WHEREEXISTS(SELECT'X'FROM DEPARTMENTswheresEMP_DEPT=DPT_IDAND DPT_NAME LIKE'AC%')AND EMP_IDIN(SELECT SAL_EMP_IDFROM EMP_SAL_HISTB WHERESAL_SALARY>70000)   按“优化”按钮后,经过十几秒,SQL Expert就完成了优化的过程,从优化细节中可以看到,它在十几秒的时间内重写产生了2267条等价的SQL语句,其中136条SQL语句有不同的执行计划(如图3)。图3 优化结果  接下来我们可以对自动重写产生的136条具有不同执行计划的SQL语句进行批运行测试,以选出性能最佳的等效SQL语句。按下“批运行”按钮,在“终止条件”页选择“最佳运行时间SQL语句”(如图4),按“确定”。图4 测试条件  经过几分钟的测试运行后,我们可以发现SQL124的运行时间和反应时间最短。运行速度约有22.75倍的提升(源SQL语句运行时间为2.73秒,SQL124运行时间为0.12秒,如图5)。图5 测试结果  我们把SQL124放入源代码中,结束一条SQL语句的优化工作。从上例可以看到,LECCO SQL Expert的自动重写技术使原来需要几小时才能完成的SQL语句的优化工作,缩减到几分钟之内就可以完成。数据库管理员和开发人员可以从繁重的SQL语句优化工作中解脱出来。  边做边学式训练  LECCO SQL Expert不仅能够找到最佳的SQL语句,而且提供的“边做边学式训练”还能够教会开发人员和数据库管理员如何写出性能最好的SQL语句。LECCO SQL Expert的“SQL比较器”可以标明源SQL和待选SQL之间的不同之处。LECCO SQL Expert详尽的上下文敏感帮助系统可以指出执行计划的深层含义。图6 源语句与SQL124的比较  以上面优化的结果为例,为了查看源SQL语句和SQL124在写法上的不同,我们可以按下“比较器”按钮,对SQL124和源SQL语句进行比较。如果选择“双向比较”复选框,“SQL比较器”可以将两条互相间的不同之处以蓝色表示。当然,你也可以从 源语句和重写后的SQL语句中任选两条进行比较(如图6)。  从比较的结果可以看到,重写得到的SQL124把第一个Exists改写成了In;在字段DPT_ID上进行了合并空字符串的操作以诱导数据库先执行子查询中的(SELECTDPT_ID||'FROMDEPART-MENTWH

34,871

社区成员

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

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