先进先出的数据冲销处理

原创 2005年06月02日 21:59:00

先进先出的数据冲销处理

--示例数据:
create table 销售订单(单号 varchar(10),日期 datetime,货品编码 varchar(10),数量 int)
insert 销售订单 
select 'A1','2005-5-1','ABCD',100 union all
select 'A2','2005-5-3','ABCD',200 union all
select 'A3','2005-5-4','ABCD',300 union all
select 'A4','2005-5-8','ABCD',500

create table 销售发货单(单号 varchar(10),日期 datetime,货品编码 varchar(10),数量 int)
insert 销售发货单
select 'B1','2005-5-05','ABCD',250 union all
select 'B2','2005-5-07','ABCD',100 union all
select 'B3','2005-5-10','ABCD',150'
GO

问题描述:
    对于示例数据中的销售订单和销售发货单,由于客户在做销售发货时无法指定本次是要发那一张订单的东西。所以销售订单无法与销售发货单关联。客户要求以先进先出的方式统计销售订单的执行情况。对于示例数据,要求结果如下:
单号        日期             货品编码    订单数量    发货数量     待执行数量       
---------- ----------------- ------------- -------------- --------------- ------------------ 
A1         2005-05-01   ABCD       100            100              0
A2         2005-05-03   ABCD       200            200             0
A3         2005-05-04   ABCD       300            200            100
A4         2005-05-08   ABCD       500            0                 500
                                      合计          1100         500             600

--查询处理的过程
select 
    a.单号,a.日期,a.货品编码,
    订单数量=a.数量,
    发货数量=isnull(case when a.s数量<b.数量 then a.数量 else b.数量-a.p数量 end,0),
    待执行数量=case when a.s数量<b.数量 then 0 else a.s数量-isnull(b.数量,a.p数量) end
into # from(
    select 单号,日期=convert(char(10),日期,120),货品编码,
        数量=sum(数量),
        p数量=isnull((select sum(数量) from 销售订单
    where 货品编码=a.货品编码
        and(datediff(day,日期,min(a.日期))>0
        or datediff(day,日期,min(a.日期))=0 and 单号<a.单号)),0),
        s数量=isnull((select sum(数量) from 销售订单
            where 货品编码=a.货品编码
                and(datediff(day,日期,min(a.日期))>0
                or datediff(day,日期,min(a.日期))=0 and 单号<=a.单号)),0)
    from 销售订单 a
    group by 单号,convert(char(10),日期,120),货品编码
)a 
    left join(
        select 货品编码,数量=sum(数量)
        from 销售发货单
        group by 货品编码
    )b on a.货品编码=b.货品编码
        and a.p数量<b.数量
order by a.单号,a.日期,a.货品编码

select * from #
union all
select '','','合计',sum(订单数量),sum(发货数量),sum(待执行数量) from #
drop table #

原帖地址

相关文章推荐

【JAVA数据结构】先进先出队列

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的...

操作系统--页面置换算法(先进先出算法,最近最久未使用算法,最佳置换算法)--JAVA实现

模拟操作系统对内存与虚拟内存的页面置换算法,当分配的内存不足时,进行替换 大家直接看代码吧,里面的注释应该够了,这三个程序结构差不多,只是在替换算法有差别 1.先看最简单的先入先出算法: p...
  • mzlqh
  • mzlqh
  • 2012年06月08日 13:20
  • 11664

sql先进先出查询解决办法

求 sql先进先出查询解决办法???? 商品编号  批次号  库存数量 0001      090801     200 0001      090501      50...
  • sunfor
  • sunfor
  • 2011年09月15日 15:13
  • 2761

用memcache实现简单的先进先出队列

本代码根据前辈的代码简化修改而成 class memcacheQueue{ public $client;//memcache客户端连接 private $expire;//过期时间,秒,1~2...
  • so_ga
  • so_ga
  • 2015年01月24日 15:43
  • 330

先进先出队列 FIFO

fifo.h----------------------------------------------------------------------------------------------...

使用存储过程实现进销存系统中的先进先出算法(3)——Oracle9i版

本文是我在前一篇文章提到的关于先进先出存储过程,针对Oracle 9i 的修改版,基本思路一致,只是修改了关键字使用方法。         有关数据库和存储过程的设计,请参阅使用存储过程实现进销存系...

java通过链表实现队列,先进先出

节点类package queue.demo;public class Node { private Object data; private Node nextNode; pri...

Java ArrayDeque、PriorityQueue 先进先出队列(FIFO)

源码均以JDK8作为参考 队列是一种先进先出(FIFO)的数据结构。 ArrayDeque: 1.简介: ArrayDeque是JDK1.6中引入的实现。 ArrayDeque继承了Absrtac...

linux网络编程之System V 信号量(三):基于生产者-消费者模型实现先进先出的共享内存段

生产者消费者问题:该问题描述了两个共享固定大小缓冲区的进程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费...

java队列--先进先出(循环队列、链队列)

队列--一种具有先进先出特点的数据结构,在我们生活中非常常见。队列可采用数组、链表存储。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:先进先出的数据冲销处理
举报原因:
原因补充:

(最多只允许输入30个字)