SQL Server多个累积和(2012或更高版本)

时间:2015-09-28 12:20:32

标签: sql sql-server

我已经在这里阅读了一些关于累积金额的帖子,但是我一直在努力使用SUM OVER或其他使用< =作为内连接的一部分加入相同数据的累积和所以我正在寻找一些澄清。

我的财务数据中包含以下列:

AccountID,
FiscalYear,
FiscalQuarter,
FiscalPeriod,
PeriodType (we report on calendar and fiscal periods),
CurrencyType (source or functional currency),
DataSet (actual or budgeted data),
Currency (the currency of the transaction,
PeriodAmount

此信息目前按行格式汇总,因此我将数据合并在一起以表格格式表示,然后尝试逐个累计季度和年份运行总计。例如:

如果我的数据是(现在我假设货币和其他字段不是相同的,但它们会有所不同):

ACCTID FYear FQuarter FPeriod PAmount
123    2015  1        1       $100
123    2015  1        2       $100
123    2015  1        3       $100
123    2015  2        4       $100

我想要的数据应该是:

123, 2015, 1, 1, $100, $100 (cumulative quarter), $100 (cumulative year)
123, 2015, 1, 2, $100, $200 (cumulative quarter), $200 (cumulative year)
123, 2015, 1, 3, $100, $300 (cumulative quarter), $300 (cumulative year)
123, 2015, 2, 4, $100, $100 (cumulative quarter), $400 (cumulative year)

当我做SUM OVER(PARTITION BY AccountID, FYear, FQuarter)时,我觉得第一季的每个结果都得到300美元,或者当我SUM OVER(PARTITION BY AccountID, FYear)时,我每条记录总共得到400美元。

我在一百多万条记录中这样做,所以我可以接受建议。

3 个答案:

答案 0 :(得分:0)

SELECT SUM(AMOUNT) Over (Partition BY FiscalQuarter Order BY FiscalQuarter)
FROM Table_name

答案 1 :(得分:0)

我认为你在寻找的是:

function getKey(o) {
  for (var prop in o) {
    if (o.hasOwnProperty(prop)) {
      return prop;
    }
  }
}

var data = [4, {25: 4}, 5, {25: 1}, 3, {10: 1}, 4, {10: 1}];
var i = 0;
var output = [];
var key;

for (i = 0; i < data.length; i += 2) {
  key = getKey(data[i + 1]);
  output.push([data[i], parseInt(key, 10), data[i + 1][key]]);
}

//Print the output
console.log(output);

var el = document.createElement('div');
el.innerHTML = JSON.stringify(output);
document.body.appendChild(el);

确定SELECT ACCTID, FYear, FQuarter, FPeriod, PAmount, SUM(PAmount) OVER (PARTITION BY ACCTID, FYear, FQuarter ORDER BY FPeriod) AS rtQuarter, SUM(PAmount) OVER (PARTITION BY ACCTID, FYear ORDER BY FPeriod) AS rtYear FROM mytable 子句中的运行总计的因素是OVER

因此,在每个ORDER BY切片内计算上述查询返回的第一个运行总计,即rtQuarter。只要ACCTID, FYear, FQuarter值更改运行总计就会重置。

第二次运行总计,即FQuarter,按rtYear计算。 ACCTID, FYear值会随着PAmount的增加而增加。

FeedParserPCL

答案 2 :(得分:0)

你错过了OVER条款的一部分。为了计算累积总额,您需要按以下方式添加订单:

SUM(amount) OVER(PARTITION BY AccountID, FYear ORDER BY FQuarter, FPeriod )