sql-server - TSQL 运行总计
问题描述
我正在运行 MS SQL Server 2012。我正在尝试按月计算迄今为止的运行总计,并将成本类型计算为趋势。此查询按成本类型正确地为我提供了当前月份的总计:
SELECT
JCCD.Job
,JCCD.CostType
,JCCT.Description
,[Total] = SUM(JCCD.ProjCost) - SUM(JCCD.ActualCost)
FROM
JCCD JCCD
JOIN
JCCT JCCT
ON
JCCD.PhaseGroup = JCCT.PhaseGroup AND JCCD.CostType = JCCT.CostType
WHERE
JCCo = 1 AND Job = 1378 AND JCCD.Mth <= '7/1/2019'
GROUP BY
JCCD.Job
,JCCD.CostType
,JCCT.Description
ORDER BY CostType
正确结果:
Job CostType Description Total
1378. 1 Subcontractors 16145427.78
1378. 3 Materials/Supplies 11338262.26
1378. 4 Direct Labor (PR Use Only) 7132036.05
1378. 5 Repairs 166219.65
1378. 6 Fuel 976015.51
1378. 7 Equipment 5309309.12
1378. 9 Other Direct Costs 1994790.36
1378. 90 Contingency 1859419.04
1378. 95 Management Reserve 0.00
1378. 100 Allocated Indirects 427724.92
但是按成本类型计算,我每月的累计运行总额都失败了。我似乎无法弄清楚分区函数以按成本类型获取每月的累积值。这是我尝试过的一个不正确的版本:
SELECT
JCCD.Job
,JCCD.CostType
,Mth
,[Total] = SUM(JCCD.ProjCost) - SUM(JCCD.ActualCost)
,[RT] = SUM(JCCD.ProjCost) - SUM(JCCD.ActualCost) OVER (PARTITION BY Mth, CostType ORDER BY Mth, CostType RANGE UNBOUNDED PRECEDING)
FROM
JCCD JCCD
WHERE
JCCo = 1 AND Job = ' 1378.' AND JCCD.Mth <= '7/1/2019'
GROUP BY
JCCD.Job
,JCCD.CostType
,ActualCost
,ProjCost
,Mth
ORDER BY Mth
结果片段:
Job CostType Mth Total RT
1378. 9 2019-07-01 00:00:00 -4207.50 -99105.59
1378. 9 2019-07-01 00:00:00 -5036.61 -99105.59
1378. 9 2019-07-01 00:00:00 -5880.19 -99105.59
1378. 9 2019-07-01 00:00:00 -7788.37 -99105.59
1378. 9 2019-07-01 00:00:00 -35778.60 -99105.59
1378. 9 2019-07-01 00:00:00 -29694.75 -99105.59
1378. 100 2019-07-01 00:00:00 -35079.22 -17539.61
帮助!:-)
我尝试了下面的建议,但这并没有完全提供我感兴趣的结果,这里是这些结果的一个片段。如果我按成本类型每月有一笔款项,那将是正确的。
Job CostType Mth Total RT RT2
1378. 9 2019-05-01 00:00:00 -191.99 2302027.86 42364678.68
1378. 9 2019-05-01 00:00:00 -628.76 2302027.86 42364678.68
1378. 9 2019-05-01 00:00:00 -681.00 2302027.86 42364678.68
1378. 9 2019-05-01 00:00:00 -1481.18 2302027.86 42364678.68
1378. 9 2019-05-01 00:00:00 -765.06 2302027.86 42364678.68
1378. 9 2019-05-01 00:00:00 -944.25 2302027.86 42364678.68
1378. 9 2019-05-01 00:00:00 -1068.50 2302027.86 42364678.68
1378. 9 2019-05-01 00:00:00 -1082.00 2302027.86 42364678.68
解决方案
希望这会奏效,您可能必须更改PARTITION BY
适合您需要的列。
select T.*
,[RT] = SUM(t.[Total]) OVER (PARTITION BY Mth, CostType ORDER BY Mth, CostType RANGE UNBOUNDED PRECEDING)
,[RT2] = SUM(t.[Total]) OVER (PARTITION BY Mth ORDER BY CostType)
from ( SELECT JCCD.Job
,JCCD.CostType
,Mth
,[Total] = SUM(JCCD.ProjCost) - SUM(JCCD.ActualCost)
FROM JCCD JCCD
WHERE JCCo = 1 AND Job = ' 1378.' AND JCCD.Mth <= '7/1/2019'
GROUP BY JCCD.Job, JCCD.CostType, ActualCost, ProjCost,Mth
) as T
ORDER BY Mth
推荐阅读
- visual-studio-2017 - Visual Studio 2017 远程调试:网络连接丢失
- sql - 在 Postgis 中以公里为单位获取距离
- javascript - 作为参考导入的同一文件的多次导入,而不是复制
- python - Python 模拟函数参数
- powershell - 如何在批处理文件的 powershell 命令中包含与号?
- javascript - js 语法错误:参数后缺少 )
- python - 如何通过属性名称和/或值查找锚标记?
- oracle - 完整数据集的 TOAD 已用时间
- javascript - 无法从扩展标点符号中读取元素内部文本的未定义属性
- c++ - 带有多页按钮的 Qt 图表