outer apply的用法
IF EXISTS (SELECT * FROM sysobjects WHERE name ='P201_ProductStockRemainFlowQry' and xtype='P')
DROP PROCEDURE [dbo].[P201_ProductStockRemainFlowQry]
go
/*
成品库存流转查询报表取数
exec P201_ProductStockRemainFlowQry @strSysNo='447',@strProductNameCn='',@dtEndDate='2018-3-20'
*/
CREATE Proc P201_ProductStockRemainFlowQry(@strSysNo varchar(20),@strProductNameCn varchar(100),
@dtEndDate datetime)
as
Begin
print '1:' + convert(varchar(40),getdate(), 121)
--取订单(修理包产品)
Create table #tbOrderDetail
(so_product_no varchar(40),product_no varchar(40),order_num float,destine_num float,delivery_num float,
undelivery_num float,delivery_date datetime,product_name_cn varchar(100),ug_product_no varchar(40),
ug_product_name_cn varchar(100),sale_order_guid varchar(40))
Insert Into #tbOrderDetail
(so_product_no,product_no,order_num,destine_num,delivery_num,undelivery_num,
delivery_date,product_name_cn,ug_product_no,ug_product_name_cn,sale_order_guid)
select sod.product_no,rkp.output_product_no1 as product_no,
sod.order_num*rkp.output_material_rate1 as order_num,
sod.destine_num*rkp.output_material_rate1 as destine_num,
sod.delivery_num*rkp.output_material_rate1 as delivery_num,
(case when sod.order_num-sod.delivery_num>0 then sod.order_num-sod.delivery_num
else 0 end)*rkp.output_material_rate1 as undelivery_num,
sod.delivery_date,
isnull(ocProduct.object_name_cn,'') as product_name_cn,
'' as ug_product_no,
'' as ug_product_name_cn,
sod.sale_order_guid
from T201_sale_order_detail sod
inner Join T200_repaire_kit_product rkp on rkp.product_no=sod.product_no and rkp.output_product_no1>''
Left Join T200_object_code ocProduct on ocProduct.object_no=rkp.output_product_no1
where sod.sys_no=@strSysNo
and sod.audit_tag = 'T'
and sod.state_type='run'
and ocProduct.object_name_cn like '%'+@strProductNameCn+'%'
and sod.delivery_date<=@dtEndDate
and exists(select top 1 1 from T200_repaire_kit_product
where product_no=sod.product_no)
Insert Into #tbOrderDetail
(so_product_no,product_no,order_num,destine_num,delivery_num,undelivery_num,
delivery_date,product_name_cn,ug_product_no,ug_product_name_cn,sale_order_guid)
select sod.product_no as so_product_no,rkp.output_product_no2 as product_no,
sod.order_num*rkp.output_material_rate2 as order_num,
sod.destine_num*rkp.output_material_rate2 as destine_num,
sod.delivery_num*rkp.output_material_rate2 as delivery_num,
(case when sod.order_num-sod.delivery_num>0 then sod.order_num-sod.delivery_num
else 0 end)*rkp.output_material_rate2 as undelivery_num,
sod.delivery_date,
isnull(ocProduct.object_name_cn,'') as product_name_cn,
'' as ug_product_no,
'' as ug_product_name_cn,
sod.sale_order_guid
from T201_sale_order_detail sod
inner Join T200_repaire_kit_product rkp on rkp.product_no=sod.product_no and rkp.output_product_no2>''
Left Join T200_object_code ocProduct on ocProduct.object_no=rkp.output_product_no2
where ocProduct.object_name_cn like '%'+@strProductNameCn+'%'
and sod.delivery_date<=@dtEndDate
and exists(select top 1 1 from T200_repaire_kit_product
where product_no=sod.product_no)
--取订单(非修理包产品)
Insert Into #tbOrderDetail
(so_product_no,product_no,order_num,destine_num,delivery_num,undelivery_num,
delivery_date,product_name_cn,ug_product_no,ug_product_name_cn,sale_order_guid)
select sod.product_no as so_product_no,sod.product_no,
sod.order_num,
sod.destine_num,
sod.delivery_num,
case when sod.order_num-sod.delivery_num>0 then sod.order_num-sod.delivery_num
else 0 end as undelivery_num,
sod.delivery_date,
isnull(ocProduct.object_name_cn,'') as product_name_cn,
'' as ug_product_no,
'' as ug_product_name_cn,
sod.sale_order_guid
from T201_sale_order_detail sod
Left Join T200_object_code ocProduct on ocProduct.object_no=sod.product_no
where ocProduct.object_name_cn like '%'+@strProductNameCn+'%'
and sod.delivery_date<=@dtEndDate
and not exists(select top 1 1 from T200_repaire_kit_product
where product_no=sod.product_no)
print '2:' + convert(varchar(40),getdate(), 121)
--更新ug品名
--取UG品的产品类别编码
declare @syspar_type_no_of_UG varchar(20)
select @syspar_type_no_of_UG = dbo.F100_GetStrSysParValue(replace(db_name(),'wsbase',''),'type_no_of_UG')
Declare @tbUgType table(type_no varchar(40))
Insert Into @tbUgType
Select distinct str_value
from dbo.GF_StringSplit(@syspar_type_no_of_UG,';')
where str_value<>''
print '2-1:' + convert(varchar(40),getdate(), 121)
update sod
set sod.ug_product_no=isnull(ppb.material_no,''),
sod.ug_product_name_cn=isnull(ppb.material_name_cn,'')
from #tbOrderDetail sod
outer apply(select top 1 material_no,
isnull(ocMaterial.object_name_cn,'') as material_name_cn
from TA04_product_part_bom ppb
left join T200_product_code pc on pc.product_no=ppb.material_no
left join @tbUgType ut on ut.type_no=pc.type_no
left join T200_object_code ocMaterial on ocMaterial.object_no=ppb.material_no
where ppb.output_product_no=sod.product_no
and ppb.main_tag='T'
and ut.type_no is not null
order by ppb.material_no)ppb
print '3:' + convert(varchar(40),getdate(), 121)
-- 返回结果
Create table #tbResult
(product_no varchar(40),product_name_cn varchar(100),order_num float,destine_num float,delivery_num float,
undelivery_num float,remain_num float,first_delivery_date datetime,last_delivery_date datetime,
ug_product_no varchar(40),ug_product_name_cn varchar(100),ug_remain_num float,ug_plan_num float,
material_no varchar(40),material_name_cn varchar(100),material_rate float,mr_remain_num float,
mjg_num float,rcl_num float,cjg_num float,dz_num float,zt_num float,
product_produce_no varchar(40),prod_product_no varchar(40),last_active_no varchar(40),
cj_product_no varchar(40),dj_product_no varchar(40))
--插入ug品名不为空的记录
Insert Into #tbResult(product_no,product_name_cn,order_num,destine_num,delivery_num,undelivery_num,
remain_num,first_delivery_date,last_delivery_date,ug_product_no,ug_product_name_cn,
ug_remain_num,ug_plan_num,material_no,material_name_cn,material_rate,mr_remain_num,
mjg_num,rcl_num,cjg_num,dz_num,zt_num,product_produce_no,prod_product_no,last_active_no,
cj_product_no,dj_product_no)
select main.product_no,main.product_name_cn,main.order_num,main.destine_num,
main.delivery_num,main.undelivery_num,
isnull(srProduct.remain_num,0) as remain_num,
main.first_delivery_date,main.last_delivery_date,
main.ug_product_no,main.ug_product_name_cn,
isnull(srUgProduct.remain_num,0) as ug_remain_num,
isnull(pd.undelivery_num,0) as ug_plan_num,
isnull(mr.material_no,'') as material_no,
isnull(ocMaterial.object_name_cn,'') as material_name_cn,
isnull(mr.material_rate,0) as material_rate,
main.mr_remain_num,main.mjg_num,main.rcl_num,main.cjg_num,main.dz_num,main.zt_num,
isnull(ug.product_produce_no,'') as product_produce_no,
isnull(ug.product_no,'') as prod_product_no,
'' as last_active_no,
'' as cj_product_no,
'' as dj_product_no
from (select sod.product_no,sod.product_name_cn,
sum(sod.order_num) as order_num,
sum(sod.destine_num) as destine_num,
sum(sod.delivery_num) as delivery_num,
sum(sod.undelivery_num) as undelivery_num,
min(sod.delivery_date) as first_delivery_date,
max(sod.delivery_date) as last_delivery_date,
max(sod.ug_product_no) as ug_product_no,
max(sod.ug_product_name_cn) as ug_product_name_cn,
CAST(0 as float) as mr_remain_num,
CAST(0 as float) as mjg_num,
CAST(0 as float) as rcl_num,
CAST(0 as float) as cjg_num,
CAST(0 as float) as dz_num,
CAST(0 as float) as zt_num
from #tbOrderDetail sod
outer apply(select top 1 product_produce_no,product_no,bom_level
from TA04_product_part_bom
where output_product_no=sod.ug_product_no
and main_tag='T'
order by material_no)ug
where sod.ug_product_no>''
group by sod.product_no,sod.product_name_cn
)main
outer apply(select SUM(remain_num) as remain_num
from T205_stock_remain sr
where sr.product_no=main.product_no)srProduct
outer apply(select SUM(remain_num) as remain_num
from T205_stock_remain sr
where sr.product_no=main.ug_product_no)srUgProduct
outer apply(select SUM(plan_num-delivery_num) as undelivery_num
from TA03_PD_plan_detail pd
where pd.product_no=main.ug_product_no
and state_type='run')pd
outer apply(select top 1 product_no,product_produce_no,material_no,bom_level
from TA04_product_part_bom
where output_product_no=main.product_no
and material_no=main.ug_product_no
and main_tag='T'
order by material_no)ug
outer apply(select ppb.material_no,ppb.material_rate,ppb.bom_level
from TA04_product_part_bom ppb
left join T200_product_code pc on pc.product_no=ppb.material_no
where ppb.output_product_no=ug.material_no
and ppb.product_no=ug.product_no
and ppb.product_produce_no=ug.product_produce_no
and LEN(ppb.bom_level)=LEN(ug.bom_level)+4
and ppb.main_tag='T'
and pc.self_purchase='self_made')mr
Left Join T200_object_code ocMaterial on ocMaterial.object_no=mr.material_no
print '4:' + convert(varchar(40),getdate(), 121)
--插入ug品名为空的记录
Insert Into #tbResult(product_no,product_name_cn,order_num,destine_num,delivery_num,undelivery_num,
remain_num,first_delivery_date,last_delivery_date,ug_product_no,ug_product_name_cn,
ug_remain_num,ug_plan_num,material_no,material_name_cn,material_rate,mr_remain_num,
mjg_num,rcl_num,cjg_num,dz_num,zt_num,product_produce_no,prod_product_no,last_active_no,
cj_product_no,dj_product_no)
select main.product_no,main.product_name_cn,main.order_num,main.destine_num,
main.delivery_num,main.undelivery_num,
isnull(srProduct.remain_num,0) as remain_num,
main.first_delivery_date,main.last_delivery_date,
main.ug_product_no,main.ug_product_name_cn,
isnull(srUgProduct.remain_num,0) as ug_remain_num,
isnull(pd.undelivery_num,0) as ug_plan_num,
isnull(mr.material_no,'') as material_no,
isnull(ocMaterial.object_name_cn,'') as material_name_cn,
isnull(mr.material_rate,0) as material_rate,
main.mr_remain_num,main.mjg_num,main.rcl_num,main.cjg_num,main.dz_num,main.zt_num,
isnull(ug.product_produce_no,'') as product_produce_no,
isnull(ug.product_no,'') as prod_product_no,
'' as last_active_no,
'' as cj_product_no,
'' as dj_product_no
from (select sod.product_no,sod.product_name_cn,
sum(sod.order_num) as order_num,
sum(sod.destine_num) as destine_num,
sum(sod.delivery_num) as delivery_num,
sum(sod.undelivery_num) as undelivery_num,
min(sod.delivery_date) as first_delivery_date,
max(sod.delivery_date) as last_delivery_date,
max(sod.ug_product_no) as ug_product_no,
max(sod.ug_product_name_cn) as ug_product_name_cn,
CAST(0 as float) as mr_remain_num,
CAST(0 as float) as mjg_num,
CAST(0 as float) as rcl_num,
CAST(0 as float) as cjg_num,
CAST(0 as float) as dz_num,
CAST(0 as float) as zt_num
from #tbOrderDetail sod
outer apply(select top 1 product_produce_no,product_no,bom_level
from TA04_product_part_bom
where output_product_no=sod.ug_product_no
and main_tag='T'
order by material_no)ug
where sod.ug_product_no=''
group by sod.product_no,sod.product_name_cn
)main
outer apply(select SUM(remain_num) as remain_num
from T205_stock_remain sr
where sr.product_no=main.product_no)srProduct
outer apply(select SUM(remain_num) as remain_num
from T205_stock_remain sr
where sr.product_no=main.ug_product_no)srUgProduct
outer apply(select SUM(plan_num-delivery_num) as undelivery_num
from TA03_PD_plan_detail pd
where pd.product_no=main.ug_product_no
and state_type='run')pd
outer apply(select top 1 product_no,product_produce_no,material_no,bom_level
from TA04_product_part_bom
where output_product_no=main.product_no
and product_no=main.product_no
and material_no=main.product_no
and main_tag='T'
order by material_no)ug
outer apply(select ppb.material_no,ppb.material_rate,ppb.bom_level
from TA04_product_part_bom ppb
left join T200_product_code pc on pc.product_no=ppb.material_no
where ppb.output_product_no=ug.material_no
and ppb.product_no=ug.product_no
and ppb.product_produce_no=ug.product_produce_no
and LEN(ppb.bom_level)=LEN(ug.bom_level)+4
and ppb.main_tag='T'
and pc.self_purchase='self_made')mr
Left Join T200_object_code ocMaterial on ocMaterial.object_no=mr.material_no
print '5:' + convert(varchar(40),getdate(), 121)
--更新最后一道工序
update main
set main.last_active_no=isnull(ppc.active_no,'')
from #tbResult main
outer apply(select top 1 ppc.active_no
from TA04_product_part_craft ppc
where ppc.output_product_no=main.material_no
and ppc.product_no=main.product_no
and ppc.product_produce_no=main.product_produce_no
order by craft_sequence desc)ppc
--更新车件品名
update main
set main.cj_product_no=isnull(ppb.material_no,'')
from #tbResult main
outer apply(select top 1 ppb.material_no
from TA04_product_part_bom ppb
where ppb.output_product_no=main.material_no
and ppb.product_no=main.product_no
and ppb.product_produce_no=main.product_produce_no
and ppb.main_tag='T'
order by ppb.material_no
)ppb
--更新锻件品名
update main
set main.dj_product_no=isnull(ppb.material_no,'')
from #tbResult main
outer apply(select top 1 ppb.material_no
from TA04_product_part_bom ppb
where ppb.output_product_no=main.cj_product_no
and ppb.product_no=main.product_no
and ppb.product_produce_no=main.product_produce_no
and ppb.main_tag='T'
order by ppb.material_no
)ppb
print '6:' + convert(varchar(40),getdate(), 121)
--更新材料完工品数(完工工序是最后一道工序的库存)
--完工品:内圈/外圈等材料对应的库存
--磨加工:内圈/外圈对应磨加工 的在制库存(按照品名编码找车间在制,除热处理工序)
--热处理:内圈/外圈对应热处理 工序的在制库存
--车加工:内圈/外圈对应下一级车件的车间在制库存
--锻造:内圈/外圈下一级车件对应的原材料库存
--在途:内圈/外圈下一级车件对应的原材料采购在途数
update main
set main.mr_remain_num=ISNULL(sr.remain_num,0),
main.mjg_num=ISNULL(mjg.mjg_remain_num,0),
main.rcl_num=ISNULL(mjg.rcl_remain_num,0),
main.cjg_num=ISNULL(cj.remain_num,0),
main.dz_num=ISNULL(dj.remain_num,0),
main.zt_num=ISNULL(sod.order_num,0)
from #tbResult main
outer apply(select SUM(remain_num) as remain_num
from T205_stock_remain
where product_no=main.material_no
and finish_active_no=main.last_active_no)sr
outer apply(select SUM(case when finish_active_no='RCL' then remain_num
else 0 end) as rcl_remain_num,
SUM(case when finish_active_no<>'RCL' then remain_num
else 0 end) as mjg_remain_num
from T205_stock_remain
where product_no=main.material_no
and finish_active_no<>main.last_active_no
)mjg
outer apply(select SUM(remain_num) as remain_num
from T205_stock_remain
where product_no=main.cj_product_no)cj
outer apply(select SUM(remain_num) as remain_num
from T205_stock_remain
where product_no=main.dj_product_no)dj
outer apply(select SUM(order_num-delivery_num) as order_num
from T202_supply_order_detail
where product_no=main.dj_product_no
and audit_tag='T'
and state_type='run')sod
print '7:' + convert(varchar(40),getdate(), 121)
select *
from #tbResult main
select distinct sale_order_guid,product_no
from #tbOrderDetail
print '8:' + convert(varchar(40),getdate(), 121)
End
outer apply的用法相关推荐
- sqlserver中cross apply与outer apply用法
apply有两种形式: cross apply 和 outer apply 先看看语法: <left_table_expression> {cross|outer} apply < ...
- SQLServer基础:Apply关键字用法介绍
1.概念介绍 APPLy关键字是SQLServer版本中开始提供的一个系统关键字. APPLY的功能同联接很类似,APPLY运算分左右两个部分, APPLY的右表达式:左表达式的每一行都和右表达式进行 ...
- Cross Apply的用法
GPS平台.网站建设.软件开发.系统运维,找森大网络科技! https://cnsendnet.taobao.com 来自森大科技官方博客 http://www.cnsendblog.com/inde ...
- SQL 关于apply的两种形式cross apply 和 outer apply
SQL 关于apply的两种形式cross apply 和 outer apply 阅读目录 SQL 关于apply的两种形式cross apply 和 outer apply Sql学习第四天--S ...
- SQL Server中CROSS APPLY和OUTER APPLY的应用详解
SQL Server数据库操作中,在2005以上的版本新增加了一个APPLY表运算符的功能.新增的APPLY表运算符把右表表达式应用到左表表达式中的每一行.它不像JOIN那样先计算那个表表达式都可以, ...
- SQL Server 2008的cross apply 和 outer apply
我们知道有个 SQL Server 2000 中有个 cross join 是用于交叉联接的.实际上增加 cross apply 和 outer apply 是用于交叉联接表值函数(返回表结果集的函数 ...
- mysql cross apply_SQL Server CROSS APPLY和OUTER APPLY的应用详解
SQL Server数据库操作中,在2005以上的版本新增加了一个APPLY表运算符的功能 SQL Server数据库操作中,在2005以上的版本新增加了一个APPLY表运算符的功能.新增的APPLY ...
- CROSS APPLY 和outer apply
/* CREATE TABLE A(id INT, NAME VARCHAR(30)) CREATE TABLE B(id INT, marks VARCHAR(30)) INSERT ...
- SQL 关于apply的两种形式cross apply 和 outer apply(转)
转载链接:http://www.cnblogs.com/shuangnet/archive/2013/04/02/2995798.html apply有两种形式: cross apply 和 oute ...
最新文章
- python 使用set对list去重,并保持list原来顺序
- java 接口 实现和继承关系
- 在场景中输出横向或纵向压缩的中文字符
- 计组-I/O系统的基本概念
- 中检测到有潜在危险的 request.form 值。_洛宁县钢结构厂房加固检测设计中心
- 前端学习(2143):webpack的config.js配置和package.json
- 小程序button去除边框
- RHEL5.9下cacti监控的部署详解
- C语言编写学生管理系统
- 《机器视觉算法与应用》第3章 机器视觉算法之图像增强——学习笔记
- 软件设计模式概念与意义
- 【问】历史库存查询的结存数量和商品进销存报表的结存数量对不上
- 软件测试整理:测试设计
- 【经典】zheng项目搭建
- 关联规则:R与SAS的比较
- 集合--1.集合的概念和结构
- k8s重启节点状态NotReady
- IDEA 自动导入的配置(Auto import)
- 永远不能懈怠,要记住,黎明之前,最为黑暗
- 猫眼top100部高分电影spider
热门文章
- UE:无法解析的外部符号 “public: __cdecl FKey::~FKey(void)“ (??1FKey@@QEAA@XZ)
- 2021 考研英语题难度如何?英语一英语二有哪些亮点和槽点?
- 独立站的免费流量玩法
- 【vscode插件集】学前端一年,珍藏的 40个 vscode 插件
- 领英这样加人,一个月轻松加5000人
- 互联网下半场,苏宁“拼购村”如何打造现象级模式
- 【leetcode】开密码锁
- python安卓库拍照_Python Faker库的实战,用Faker库生成伪造的安卓通讯录
- [NOI2016] 优秀的拆分 题解
- NOI 1.11 二分查找 04: 网线主管