Foxtable(狐表)用户栏目专家坐堂 → 统计累计数量的代码如何优化?


  共有2370人关注过本帖树形打印复制链接

主题:统计累计数量的代码如何优化?

帅哥哟,离线,有人找我吗?
happyft
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1926 积分:17397 威望:0 精华:0 注册:2014/7/29 19:09:00
统计累计数量的代码如何优化?  发帖心情 Post By:2021/6/23 18:48:00 [只看该作者]

要要根据某一日期查询订单表中的产品累计生产数量,用了下面的代码
--统计每天的累计生产完成情况
DECLARE @dateS DATETIME;
SET @dateS = '2021-06-01';
SELECT  a.客户 ,
        a.产品编码 ,
        a.规格 ,
        a.订单数量 ,
        a.下单日期 ,
        ( SELECT    SUM(t1.订单数量)
          FROM      ( SELECT    a.F15 AS 产品编码 ,
                                a.F20 AS 订单数量 ,
                                b.F3 AS 下单日期 ,
                                b.F5 AS 客户
                      FROM      JBL.dbo.tabDIYTable3 a
                                INNER JOIN JBL.dbo.tabDIYTable2 b ON b.ID = a.ID
                    ) AS t1
          WHERE     t1.产品编码 = a.产品编码
                    AND t1.下单日期 >= a.下单日期
        ) AS '累计订单量' ,
        ( SELECT    SUM(t1.生产数量)
          FROM      ( SELECT    a.F2768 AS 产品编码 ,
                                CAST(a.F2716 AS INT) AS 生产数量 ,
                                a.F2710 AS 机台 ,
                                b.F2703 AS 生产日期 ,
                                b.F2704 AS 生产车间
                      FROM      JBL.dbo.tabDIYTable252 a
                                INNER JOIN JBL.dbo.tabDIYTable251 b ON b.ID = a.ID
                    ) AS t1
          WHERE     t1.产品编码 = a.产品编码
                    AND t1.生产日期 >= a.开始生产日期
                    AND t1.生产日期 <= @dateS
        ) AS '总累计产量' ,
        ( SELECT    SUM(t1.生产数量)
          FROM      ( SELECT    a.F2768 AS 产品编码 ,
                                CAST(a.F2716 AS INT) AS 生产数量 ,
                                a.F2710 AS 机台 ,
                                b.F2703 AS 生产日期 ,
                                b.F2704 AS 生产车间
                      FROM      JBL.dbo.tabDIYTable252 a
                                INNER JOIN JBL.dbo.tabDIYTable251 b ON b.ID = a.ID
                    ) AS t1
          WHERE     t1.产品编码 = a.产品编码
                    AND t1.生产日期 >= a.开始生产日期
                    AND t1.生产日期 < @dateS  --去掉等号表示今天以前
        ) AS '昨日累计产量' ,
        ( SELECT    SUM(t1.生产数量)
          FROM      ( SELECT    a.F2768 AS 产品编码 ,
                                CAST(a.F2716 AS INT) AS 生产数量 ,
                                a.F2710 AS 机台 ,
                                b.F2703 AS 生产日期 ,
                                b.F2704 AS 生产车间
                      FROM      JBL.dbo.tabDIYTable252 a
                                INNER JOIN JBL.dbo.tabDIYTable251 b ON b.ID = a.ID
                    ) AS t1
          WHERE     t1.产品编码 = a.产品编码
                    AND t1.生产日期 = @dateS
        ) AS '当日总产量' ,
        ( SELECT    SUM(t1.生产数量)
          FROM      ( SELECT    a.F2768 AS 产品编码 ,
                                CAST(a.F2716 AS INT) AS 生产数量 ,
                                a.F2710 AS 机台 ,
                                b.F2703 AS 生产日期 ,
                                b.F2704 AS 生产车间
                      FROM      JBL.dbo.tabDIYTable252 a
                                INNER JOIN JBL.dbo.tabDIYTable251 b ON b.ID = a.ID
                    ) AS t1
          WHERE     t1.产品编码 = a.产品编码
                    AND t1.生产日期 = @dateS
                    AND t1.生产车间 = '自动车A班'
        ) AS 'A班当日产量' ,
        ( SELECT    SUM(t1.生产数量)
          FROM      ( SELECT    a.F2768 AS 产品编码 ,
                                CAST(a.F2716 AS INT) AS 生产数量 ,
                                a.F2710 AS 机台 ,
                                b.F2703 AS 生产日期 ,
                                b.F2704 AS 生产车间
                      FROM      JBL.dbo.tabDIYTable252 a
                                INNER JOIN JBL.dbo.tabDIYTable251 b ON b.ID = a.ID
                    ) AS t1
          WHERE     t1.产品编码 = a.产品编码
                    AND t1.生产日期 = @dateS
                    AND t1.生产车间 = '自动车B班'
        ) AS 'B班当日产量' ,
        ( SELECT    SUM(t1.生产数量)
          FROM      ( SELECT    a.F2768 AS 产品编码 ,
                                CAST(a.F2716 AS INT) AS 生产数量 ,
                                a.F2710 AS 机台 ,
                                b.F2703 AS 生产日期 ,
                                b.F2704 AS 生产车间
                      FROM      JBL.dbo.tabDIYTable252 a
                                INNER JOIN JBL.dbo.tabDIYTable251 b ON b.ID = a.ID
                    ) AS t1
          WHERE     t1.产品编码 = a.产品编码
                    AND t1.生产日期 = @dateS
                    AND t1.生产车间 = '自动车C班'
        ) AS 'C班当日产量' ,
        ( SELECT    SUM(t1.生产数量)
          FROM      ( SELECT    a.F2768 AS 产品编码 ,
                                CAST(a.F2716 AS INT) AS 生产数量 ,
                                a.F2710 AS 机台 ,
                                b.F2703 AS 生产日期 ,
                                b.F2704 AS 生产车间
                      FROM      JBL.dbo.tabDIYTable252 a
                                INNER JOIN JBL.dbo.tabDIYTable251 b ON b.ID = a.ID
                    ) AS t1
          WHERE     t1.产品编码 = a.产品编码
                    AND t1.生产日期 = @dateS
                    AND t1.生产车间 = '自动车D班'
        ) AS 'D班当日产量'
FROM    dbo.订单计划简表 a
累计的种类有点多,但才50个左右的产品就用了16秒,还有没有其他办法让查询更快?

谢谢!

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:109720 积分:558310 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/6/24 8:45:00 [只看该作者]

试试
1、给这些查询条件的列加上索引
2、给生产车间做个分组统计,在和主表做内连接
3、把子查询定义为视图使用

 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1926 积分:17397 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2021/6/24 9:29:00 [只看该作者]

谢谢,昨天已经改好了,生产车间先做分组统计存入临时表,再连接就可以了

 回到顶部