微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sql – 为每2行运行计数

我正在计算如下两行的运行次数,
CREATE TABLE sales
(
     EmpId INT,Yr INT,Sales DECIMAL(8,2)
)

INSERT INTO sales (EmpId,Yr,Sales)
VALUES (1,2005,12000),(1,2006,18000),2007,25000),2008,2009,(2,15000),6000),6000)

SELECT 
    EmpId,sales,SUM(Sales) OVER (PARTITION BY empid ORDER BY empid ROWS BETWEEN 2 PRECEDING AND CURRENT ROW ) AS TotalSales2
FROM 
    sales

输出

EmpId   Yr      sales   TotalSales2
-----------------------------------
  1     2005    12000      12000
  1     2006    18000      30000
  1     2007    25000      55000
  1     2008    25000      68000
  1     2009    25000      75000
  2     2005    15000      15000
  2     2006     6000      21000
  2     2007     6000      27000

但预期产出:

EmpId   Yr     Sales    TotalSales2
-----------------------------------
  1     2005    12000   12000
  1     2006    18000   30000
  1     2007    25000   25000   
  1     2008    25000   50000
  1     2009    25000   25000   
  2     2005    15000   15000
  2     2006     6000   21000
  2     2007     6000    6000

在这查询中我做错了什么?

注意:sql Servre版本是2012.

解决方法

表达方式:
SUM(Sales) OVER (PARTITION BY empid 
                 ORDER BY empid 
                 ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)

计算考虑当前行和其前面的2行的总和.所以它实际上是计算一个滚动总和,这是你真正不想要的.

我想你实际上正在寻找如下的东西:

;WITH CTE_Group AS (
    SELECT EmpId,(ROW_NUMBER() OVER (PARTITION BY empid ORDER BY yr) + 1 ) / 2 AS grp
    FROM sales      
)
SELECT EmpId,SUM(sales) OVER (PARTITION BY empid,grp 
                        ORDER BY yr) AS TotalSales2
FROM CTE_Group

上述查询使用CTE计算字段grp:该字段的值对于empid分区的前两个记录为1,对于接下来的两个记录为2,依此类推.

使用grp,我们可以按照OP的要求,计算2组的销售运行总计.

Demo here

编辑:

为了抵消更大的一组记录,尝试使用(信用@Max Szczurek指出这一点):

(ROW_NUMBER() OVER (PARTITION BY empid ORDER BY yr) - 1 ) / n AS grp

其中n是每个组包含的记录数.

原文地址:https://www.jb51.cc/mssql/81382.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐