Foxtable(狐表)用户栏目专家坐堂 → 计算累计数量的查询应该如何写?


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

主题:计算累计数量的查询应该如何写?

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


加好友 发短信
等级:八尾狐 帖子:1930 积分:17528 威望:0 精华:0 注册:2014/7/29 19:09:00
计算累计数量的查询应该如何写?  发帖心情 Post By:2019/7/19 19:55:00 [只看该作者]

SELECT  a.* ,
        ( SELECT    SUM(进出数量)
          FROM      a as b
          WHERE     b.rowNum <= a.rowNum
        ) AS 累计数量
FROM    ( SELECT    进出单号 ,
                    进出日期 ,
                    进出类别 ,
                    入库数量 ,
                    出库数量 ,
                    进出数量 ,
                    计量单位 ,
                    ROW_NUMBER() OVER ( PARTITION BY 产品编码 ORDER BY 进出日期, 盘点序号 ) AS rowNum
          FROM      uv_ck110
          WHERE     进出日期 >= '2019-06-30'
                    AND 产品编码 = 'B0101010'
        ) a
ORDER BY a.rowNum;

上面红色部份写法出错,通不过,如果将下面的子查询先存入到一个临时表中再类似查询就可以,不能直接写sql语句一次性实现吗?

谢谢!

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


加好友 发短信
等级:超级版主 帖子:110333 积分:561507 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/7/19 20:31:00 [只看该作者]

试试


With cte As
  (
       Select    进出单号 ,
                    进出日期 ,
                    进出类别 ,
                    入库数量 ,
                    出库数量 ,
                    进出数量 ,
                    计量单位 ,
                    ROW_NUMBER() OVER ( PARTITION BY 产品编码 ORDER BY 进出日期, 盘点序号 ) As rowNum
          FROM      uv_ck110
          WHERE     进出日期 >= '2019-06-30'
                    And 产品编码 = 'B0101010'
 )
Select t2.*,
  (  Select SUM(进出数量)
      FROM cte t1
       WHERE t1.rowNum<=t2.rowNum
       ) As 累计数量
 FROM cte t2

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


加好友 发短信
等级:八尾狐 帖子:1930 积分:17528 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2019/7/20 12:06:00 [只看该作者]

Select t2.*,
  (  Select SUM(进出数量)
      FROM cte t1
       WHERE t1.rowNum<=t2.rowNum
       ) As 累计数量
 FROM cte t2

可以是可以,但是加上这个汇总,速度就会慢几秒
           drs = DataTables(tbl2.name).Select("","rowNum")
            If drs.count > 0 Then
                If drs(0)("进出类别") = "盘点" Then
                    drs(0)("结存数量") = drs(0)("入库数量")
                Else
                    drs(0)("结存数量") = drs(0)("入库数量") - drs(0)("出库数量")
                End If
                For i As Integer = 1 To drs.Count - 1 '从集合的下一行开始计算
                    drs(i)("结存数量") = drs(i-1)("结存数量") + drs(i)("入库数量") - drs(i)("出库数量")
                Next
            End If
上面是ft中的方式速度很快,sql中直接查询要如何实现快速累计呢?

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


加好友 发短信
等级:超级版主 帖子:110333 积分:561507 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/7/20 14:24:00 [只看该作者]

SqlServer2008也就这样了,试试给进出日期, 盘点序号建一个索引,产品编码建一个索引

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


加好友 发短信
等级:八尾狐 帖子:1930 积分:17528 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2019/7/20 22:16:00 [只看该作者]

总共有近100万的数据,这个查询是近二十几个表的union all一起的查询,每个表的日期都有建立索引,所以上面CTE查询出来很快,也就一两秒,查询得到的数据一般只有50条以内,再用下面那个累计汇总CTE查询得到的数据就要4到5秒,感觉好怪
只有几十条数据,应该瞬间完成,现在是查询数据直接到ft中再进行汇总,是非常快,就是感觉sql中实现应该更快才是

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


加好友 发短信
等级:超级版主 帖子:110333 积分:561507 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/7/21 20:08:00 [只看该作者]

不是这样理解的,查询的快慢是要看原始数据的,而不是看结果,是要从100W条数据里分析得出结果,不管得到的结果是多少,都是基于这100W的数据进行查询,如果是同一条sql,得到50条结果和得到5000条结果几乎是没有差别的。

 回到顶部