求两段代码的优化写法

zf_wl 2017-09-21 01:50:28
select * from ( 
select 入库单位,物料编码,sum(数量) as 数量 from 出入库_主表 a inner join 出入库_明细 b on a.ExcelServerRCID =b.ExcelServerRCID
where a.业务类型='入库'
group by a.入库单位 ,物料编码) 入库数据
left join
(
select 出库单位,物料编码,sum(数量) as 数量 from 出入库_主表 a inner join 出入库_明细 b on a.ExcelServerRCID =b.ExcelServerRCID
where a.业务类型='出库'
group by 出库单位,物料编码) 出库数据
on 入库数据.入库单位=出库数据.出库单位 and 入库数据.物料编码=出库数据.物料编码



select distinct  单位,物料编码 from (
select 入库单位 as 单位,物料编码 from 出入库_主表 a inner join 出入库_明细 b on a.ExcelServerRCID =b.ExcelServerRCID
union all
select 出库单位 as 单位,物料编码 from 出入库_主表 a inner join 出入库_明细 b on a.ExcelServerRCID =b.ExcelServerRCID ) 仓库物料



求以上两段代码的优化写法。
...全文
221 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
RINK_1 2017-09-21
  • 打赏
  • 举报
回复
引用 4 楼 guixiguixi 的回复:
[quote=引用 3 楼 RINK_1 的回复:] 每条出入库明细数据都是入库单位和出库单位同时存在有效值的? select case when 业务类型='入库' then 入库单位 else 出库单位 end as 单位,物料编码 from 出入库_主表 a inner join 出入库_明细 b on a.ExcelServerRCID =b.ExcelServerRCID GROUP BY case when 业务类型='入库' then 入库单位 else 出库单位 end as 单位,物料编码
如果是出库 ,就只看出库单位, 不管入库单位。 如果是入库单就只管入库
select 入库单位,物料编码,
       sum(case when 业务类型='入库' then 数量 else 0 end) as 入库数量,
       sum(case when 业务类型='出库' then 数量 else 0 end) as 出库数量
from 出入库_主表 a 
inner join 出入库_明细 b on a.ExcelServerRCID =b.ExcelServerRCID
group by 出库单位,物料编码
回复于: 2017-09-21 14:48:21 #2 得分:0 对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
RINK_1
RINK_1
RINK_1  T5
每条出入库明细数据都是入库单位和出库单位同时存在有效值的?

select  case when 业务类型='入库' then 入库单位 else 出库单位 end as 单位,物料编码 
from 出入库_主表 a inner join 出入库_明细 b on a.ExcelServerRCID =b.ExcelServerRCID 
GROUP BY case when 业务类型='入库' then 入库单位 else 出库单位 end as 单位,物料编码
这是最终需要优化的代码。。。一开始准备用第一种方式了。 后来发现如果无出入库的话, 会丢失一部分物料编码。 优化这条吧[/quote] 你是从出入库_主表和出入库_明细取数,当然是只有发生过出入库的物料编码才会出现。如果你要把从来没有发生过出入库的物料编码也统计进去,这些物料编码下是存在入库单位还是出库单位呢。 那个合计出入库数量的代码有些问题,再试试下面的。

select case when 业务类型='入库' then 入库单位 else 出库单位 end as 单位,
       物料编码,
       sum(case when 业务类型='入库' then 数量 else 0 end) as 入库数量,
       sum(case when 业务类型='出库' then 数量 else 0 end) as 出库数量
from 出入库_主表 a 
inner join 出入库_明细 b on a.ExcelServerRCID =b.ExcelServerRCID
group by case when 业务类型='入库' then 入库单位 else 出库单位 end as 单位,物料编码
RINK_1 2017-09-21
  • 打赏
  • 举报
回复
每条出入库明细数据都是入库单位和出库单位同时存在有效值的? select case when 业务类型='入库' then 入库单位 else 出库单位 end as 单位,物料编码 from 出入库_主表 a inner join 出入库_明细 b on a.ExcelServerRCID =b.ExcelServerRCID GROUP BY case when 业务类型='入库' then 入库单位 else 出库单位 end as 单位,物料编码
繁花尽流年 2017-09-21
  • 打赏
  • 举报
回复
IF OBJECT_ID('tempdb..#tmp_rk') IS NOT NULL 
  	DROP TABLE #tmp_rk
SELECT	入库单位 as 单位, 物料编码, SUM(数量) AS 数量
INTO	#tmp_rk
FROM	出入库_主表 a
INNER JOIN 出入库_明细 b ON  a.ExcelServerRCID = b.ExcelServerRCID
WHERE  a.业务类型 = '入库'
GROUP BY a.入库单位, 物料编码

IF OBJECT_ID('tempdb..#tmp_ck') IS NOT NULL 
  	DROP TABLE #tmp_ck
SELECT	出库单位 AS 单位, 物料编码, SUM(数量) AS 数量
INTO	#tmp_ck
FROM	出入库_主表 a
INNER JOIN 出入库_明细 b ON  a.ExcelServerRCID = b.ExcelServerRCID
WHERE  a.业务类型 = '出库' AND a.单据状态 = '已确认'
GROUP BY 出库单位, 物料编码

SELECT 仓库物料.单位,仓库物料.物料编码, ISNULL(入库数据.数量, 0) AS 入库数量, ISNULL(出库数据.数量, 0) AS 出库数量, ISNULL(入库数据.数量, 0)-ISNULL(出库数据.数量, 0) AS 库存数量
FROM   (
           SELECT 单位, 物料编码
           FROM   (
                      SELECT 单位, 物料编码
                      FROM   #tmp_rk
                      UNION 
                      SELECT 单位, 物料编码
                      FROM   #tmp_ck
                  ) 物料资料
       )仓库物料
       LEFT JOIN #tmp_rk 入库数据
            ON  仓库物料.单位 = 入库数据.单位 AND 仓库物料.物料编码 = 入库数据.物料编码
       LEFT JOIN #tmp_ck 出库数据
            ON  仓库物料.单位 = 出库数据.单位 AND 仓库物料.物料编码 = 出库数据.物料编码
试试
RINK_1 2017-09-21
  • 打赏
  • 举报
回复

select 入库单位,物料编码,
       sum(case when 业务类型='入库' then 数量 else 0 end) as 入库数量,
       sum(case when 业务类型='出库' then 数量 else 0 end) as 出库数量
from 出入库_主表 a 
inner join 出入库_明细 b on a.ExcelServerRCID =b.ExcelServerRCID
group by 出库单位,物料编码
zf_wl 2017-09-21
  • 打赏
  • 举报
回复
上面那条代码不对。
select 仓库物料.* ,isnull(入库数据.数量,0) as 入库数量 ,isnull(出库数据.数量,0) as 出库数量,isnull(入库数据.数量,0) -isnull(出库数据.数量,0)  as 库存数量  from 
(
select distinct  单位,物料编码 from (
select  入库单位 as 单位,物料编码 from 出入库_主表 a inner join 出入库_明细 b on a.ExcelServerRCID =b.ExcelServerRCID 
union all 
select  出库单位 as 单位,物料编码 from 出入库_主表 a inner join 出入库_明细 b on a.ExcelServerRCID =b.ExcelServerRCID ) 物料资料 )仓库物料
left join 
(select 入库单位 单位,物料编码,sum(数量) as 数量 from 出入库_主表 a inner join 出入库_明细 b  on a.ExcelServerRCID =b.ExcelServerRCID 
where a.业务类型='入库'
group by a.入库单位 ,物料编码) 入库数据  on 仓库物料.单位=入库数据.单位 and 仓库物料.物料编码=入库数据.物料编码 
left join 
(
select 出库单位 as 单位,物料编码,sum(数量) as 数量 from 出入库_主表 a inner join 出入库_明细 b on a.ExcelServerRCID =b.ExcelServerRCID 
where a.业务类型='出库' and a.单据状态='已确认'
group by 出库单位,物料编码) 出库数据
on 仓库物料.单位=出库数据.单位 and 仓库物料.物料编码=出库数据.物料编码
zf_wl 2017-09-21
  • 打赏
  • 举报
回复
引用 3 楼 RINK_1 的回复:
每条出入库明细数据都是入库单位和出库单位同时存在有效值的? select case when 业务类型='入库' then 入库单位 else 出库单位 end as 单位,物料编码 from 出入库_主表 a inner join 出入库_明细 b on a.ExcelServerRCID =b.ExcelServerRCID GROUP BY case when 业务类型='入库' then 入库单位 else 出库单位 end as 单位,物料编码
如果是出库 ,就只看出库单位, 不管入库单位。 如果是入库单就只管入库
select 入库单位,物料编码,
       sum(case when 业务类型='入库' then 数量 else 0 end) as 入库数量,
       sum(case when 业务类型='出库' then 数量 else 0 end) as 出库数量
from 出入库_主表 a 
inner join 出入库_明细 b on a.ExcelServerRCID =b.ExcelServerRCID
group by 出库单位,物料编码
回复于: 2017-09-21 14:48:21 #2 得分:0 对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
RINK_1
RINK_1
RINK_1  T5
每条出入库明细数据都是入库单位和出库单位同时存在有效值的?

select  case when 业务类型='入库' then 入库单位 else 出库单位 end as 单位,物料编码 
from 出入库_主表 a inner join 出入库_明细 b on a.ExcelServerRCID =b.ExcelServerRCID 
GROUP BY case when 业务类型='入库' then 入库单位 else 出库单位 end as 单位,物料编码
这是最终需要优化的代码。。。一开始准备用第一种方式了。 后来发现如果无出入库的话, 会丢失一部分物料编码。 优化这条吧
OwenZeng_DBA 2017-09-21
  • 打赏
  • 举报
回复
第一个语句只有一个筛选条件a.业务类型='出库,第二个语句没有筛选条件。这样一次性查出的数据太多,性能会有影响

34,576

社区成员

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

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