在每行单据明细数据里增加单据汇总数据

lzheng2001 2018-01-02 09:51:20
原始数据:
单据 物料 数量
单据A, 物料A, 2
单据A, 物料B, 3
单据A, 物料C, 1
单据B, 物料A, 5
单据B, 物料B, 2

查询后的数据,增加一列汇总,
单据 物料 数量 订单数量
单据A, 物料A, 2 6
单据A, 物料B, 3 6
单据A, 物料C, 1 6
单据B, 物料A, 5 7
单据B, 物料B, 2 7

我用过Cross Apply 计算订单数量,但数据量大时查询效率并不好,看看有没更好的方法
...全文
369 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzheng2001 2018-01-03
  • 打赏
  • 举报
回复
语句比较复杂关联了很多表,还有几个cross apply ,执行计划看到眼花, 找到关键点改进就行了。
小野马1209 2018-01-02
  • 打赏
  • 举报
回复
引用 2 楼 lzheng2001 的回复:
请问sum 后面加 over 这种写法是什么版本开始支持的?
05以上 比较常用的还有按字段分组排序
SELECT ROW_NUMBER() OVER(PARTITION BY 字段  order by 字段) 
小野马1209 2018-01-02
  • 打赏
  • 举报
回复
1楼正解 SUM(数量)OVER 是汇总数量 PARTITION 后面是加分组条件
听雨停了 2018-01-02
  • 打赏
  • 举报
回复
引用 2 楼 lzheng2001 的回复:
请问sum 后面加 over 这种写法是什么版本开始支持的?
含05以上都支持
lzheng2001 2018-01-02
  • 打赏
  • 举报
回复
请问sum 后面加 over 这种写法是什么版本开始支持的?
二月十六 版主 2018-01-02
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([单据] nvarchar(23),[物料] nvarchar(23),[数量] int)
Insert #T
select N'单据A',N'物料A',2 union all
select N'单据A',N'物料B',3 union all
select N'单据A',N'物料C',1 union all
select N'单据B',N'物料A',5 union all
select N'单据B',N'物料B',2
Go
--测试数据结束
SELECT * ,
SUM(数量)OVER(PARTITION BY 单据) AS 订单数量
FROM #T


OwenZeng_DBA 2018-01-02
  • 打赏
  • 举报
回复
引用 7 楼 lzheng2001 的回复:
SELECT *,SUM(数量)OVER(PARTITION BY 单号) AS 订单数量 ( SELECT * FROM 单据 WHERE 单号='A' ) 改成以上这种形式就快了,基本不用时间。 因为实际关系表复杂得多,我只能简单写个例子。 反正再外包一层就快了,不知为什么?
最后把2者的执行计划发一下 ,然后对比看看,你现在是哪两种方式对比
lzheng2001 2018-01-02
  • 打赏
  • 举报
回复
SELECT *,SUM(数量)OVER(PARTITION BY 单号) AS 订单数量 ( SELECT * FROM 单据 WHERE 单号='A' ) 改成以上这种形式就快了,基本不用时间。 因为实际关系表复杂得多,我只能简单写个例子。 反正再外包一层就快了,不知为什么?
lzheng2001 2018-01-02
  • 打赏
  • 举报
回复
用了这个方法,大范围搜索时(如搜索一个月的单据)性能有提升, 但用单号(单号已经建立索引)搜索一张单时,速度却跟搜索一个月的速度一样用了一秒多,何解?

34,837

社区成员

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

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