首页 > 解决方案 > 试图让跑步总数发挥作用

问题描述

我有一个查询可以完美地组合当 NonProductive = 1 时被认为是 Non-Productive 的 ElapsedTime。但是,我一直在尝试让运行总计工作。这是每天按 ReportNo 汇总的主要查询:

Select SUM(CASE
           When NonProductive = 1 Then ElapsedTime
           Else 0
           End) 
            From DailyOperations
           Where (DailyOperations.WellID = 'ZCQ-5') AND (DailyOperations.JobID = 'Original')  and (ReportNo = 9)

ReportNo = 9 是第一个具有非生产时间为 4 的 Reportno。接下来是 ReportNo = 14。它有 5.5 小时的非生产时间。因此,当我运行 ReportNo 14 时,我希望总共看到 9.5,仅此而已。以下是我用于运行总计的查询,但它列出了所有非生产时间。因此,除了 ReportNo 14 仅获得 9.5 之外,我还获得了报告中每个非生产时间实例的运行总数:

SELECT (ElapsedTime),(Reportno),NonProductive,
SUM(ElapsedTime) OVER (PARTITION BY NonProductive ORDER BY REPORTNO ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
AS RUNNINGTOTAL
FROM            dbo.DailyOperations
WHERE  (NonProductive IN(1)) and  (WellID = 'ZCQ-5') AND (JobID = 'Original')  

Group by ReportNo,ElapsedTime,NonProductive

Order by ReportNo

这给了我:

ReportNo      RUNNINGTOTAL
     9               4
     14              6
     14             9.5

我想要的是:

ReportNo      RUNNINGTOTAL
     9               4
     14              9.5

标签: sqlsql-server

解决方案


我想你想要:

SELECT Reportno,NonProductive,
       SUM(SUM(ElapsedTime)) OVER (PARTITION BY NonProductive ORDER BY REPORTNO) AS RUNNINGTOTAL
FROM dbo.DailyOperations o
WHERE NonProductive IN (1) and WellID = 'ZCQ-5' AND JobID = 'Original') 
GROUP BY ReportNo
ORDER BY ReportNo;

笔记:

  • GROUP BY定义结果集中所需的每一行。因此,你只想要ReportNo它。
  • 结合窗口函数和聚合函数时,有时会得到看起来很奇怪的结构,例如SUM(SUM()).
  • 窗口条款是不必要的。您所拥有的基本上是您使用时的默认值ORDER BY(实际上,默认值是RANGE BETWEEN, 但ReportId它是唯一的,因此两者是等价的)。

推荐阅读