--示例数据:
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 #

转载于:https://www.cnblogs.com/acelove/archive/2009/11/12/1601749.html

先进先出的数据冲销处理(转邹健的个人空间)相关推荐

  1. 我做的邹健老师的sql练习题(含答案)

    我做的邹健老师的sql练习题(含答案) --试题1.2(表的建立及原题请参考邹健老师的专栏:http://blog.csdn.net/zjcxc/) (注:邹健老师的专栏有部分答案有问题) SELEC ...

  2. LabVIEW处理阵列数据时如何避免占用多份内存空间

    LabVIEW处理阵列数据时如何避免占用多份内存空间 在程序中使用一个阵列数据类型,执行时希望这个阵列数据只在内存占有一份空间.可以使用移位寄存器以及"Replace Array Subse ...

  3. mysql drop table 释放空间_MySQL删除数据几种情况以及是否释放磁盘空间【转】

    MySQL删除数据几种情况以及是否释放磁盘空间: 1.drop table table_name 立刻释放磁盘空间 ,不管是 Innodb和MyISAM ; 2.truncate table tabl ...

  4. 邹健写的公交车路线查询(包括转车近到远排列)。

    之前做过,速度跟不上 --示例数据 create   table   Line(lineID   int,state   nvarchar(10),orderid   int,primary   ke ...

  5. 【邹健】Asp.net MVC Fckeditor的扩展(支持PV3及自动绑定)

    Asp.net MVC Fckeditor的扩展(支持PV3及自动绑定) function StorePage(){d=document;t=d.selection?(d.selection.type ...

  6. 工行验证码自动识别》(邹健)二

    上一篇 / 下一篇  2007-01-20 09:30:36 查看( 9 ) / 评论( 0 ) / 评分( 0 / 0 ) 以工行验证码为例: https://mybank.icbc.com.cn/ ...

  7. 今天早上看了一个邹健写的SQL,太牛了!!

    --首先写一个函数,得到指定类别下的所有子类别 create function f_cid( @ClassName varchar(10) --要查询的类别名(如果类别名会重复,改用NClassID ...

  8. oracle导入备份失败怎么办,ORACLE 数据备份、恢复以及导入时表空间不存在的解决方案...

    一.数据备份(导出) 1.exp命令导出dmp文件(exp -help查看帮助信息) 命令:exp username/userpasswd@orcl file=G:/test.dmp log=G:/t ...

  9. java数据段 静态区_linux进程的堆栈空间_代码段(指令,只读)、数据段(静态变量,全局变量)、堆栈段(局部变量)、栈【转】...

    一)概述 .堆栈是一个用户空间的内存区域,进程使用堆栈作为临时存储. .堆栈中存放的是函数中的局部变量,在函数的生命周期中可以将变量压入堆栈,编译器需要确保堆栈指针在函数退出前恢复到初始位置,也就是说 ...

最新文章

  1. 构建可扩展的GPU加速应用程序(NVIDIA HPC)
  2. 习题10-2 递归求阶乘和 (15 分)
  3. codeforces Gargari and Permutations(DAG+BFS)
  4. Android老項目出现javax/xml/bind/JAXBException异常问题解决
  5. 指示灯组与3个复位按钮的介绍Arduino Yun快速入门教程
  6. 20189216 2018-2019-2 《密码与安全新技术专题》第七次作业
  7. Online Learning场景下实时新闻热点机器学习训练实践
  8. java服务自动降级方案_在京东我们是如何做服务降级的
  9. 【python】解析Excel中使用xlrd库、xlwt库操作,使用xluils库修改Excel文件详解(三)...
  10. midaspay能删除吗_midasPay返回90009错误
  11. Git理论、原理、操作
  12. DataGrip使用: 表的数据迁移-数据导出sql和执行sql
  13. 【百度地图API】如何激发手机的高分辨率
  14. linux5 多用户模式,centos7设置以多用户模式启动
  15. 解决Linux下路径过长一行无法显示的问题
  16. 【文献翻译】基于CVSS的IT系统网络安全风险定量评估方法-A Quantitative CVSS-Based Cyber Security Risk Assessment Methodology
  17. 关闭打印机 文件共享的服务器,文件和打印机共享服务可以禁止?
  18. AtCoder Beginner Contest 258 A~Ex 题解
  19. linux逻辑卷管理的创建过程,LVM-逻辑卷管理器创建过程for linux
  20. 数学之路-python计算实战(4)-Lempel-Ziv压缩(1)

热门文章

  1. 怎样用计算机演示声音的波形,利用音频APP演示声音特性的创新实验——智能手机上的中学物理实验创新之一...
  2. 服务部署-Samba服务器
  3. 新eve_ng添加华三模版
  4. Java8中set转list
  5. Pandas快速入门
  6. iPhone 创新乏力?或许你忽略了苹果专利库的这些黑科技
  7. Cadence 元器件数据库_如何在cadence中做振荡器电路功能仿真
  8. 计算机启动和关闭方式,电脑WIN10如何关闭和打开服务的方法
  9. 13_Course Summary_宾夕法尼亚大学机器人运动规划专项课程【学习笔记】
  10. 关于STM32 RTC时钟使用内部/外部晶振的切换方法