sql查询累计值计算

时间:2017-07-31 14:32:15

标签: sql sql-server tsql

我在为以下要求生成正确的方法/查询时面临一些设计和逻辑问题。

我的主要表是

从[table]中选择*,其中ID =' XYZ'

enter image description here

现在我按照以下要求计算累积的风险权重,我需要写一个逻辑

条件:

同年的每个月

if(Jan) - >同年1月份RiskCategory权重的总和

if(Feb) - >同年1月和2月的RiskCategory权重之和

if(March) - >同一年1月至3月的RiskCategory权重之和

if(April) - >同年1月至4月的RiskCategory权重之和

if(Dec) - >同一年1月至12月的RiskCategory权重之和

**如果任何月份存在多个RiskCategories,那么

案例1.如果值相同则只取一个值。

案例2:如果不相同则取其中的最大值。

例如,如果我们想计算2016年11月的风险权重,那么我们应该只考虑以下行

enter image description here

**因为我没有2016年1月到9月的数据,所以我只考虑了11月份计算的10月和11月数据

现在结果应该是

心血管

0.649(病例1)+

1.037肺(病例2)+

0.666对于2型糖尿病+

0.798 for Psychiatric +

1.896为肾脏+

0.536常数= 5.582

,最终结果表应为

enter image description here

请检查sqlfiddle

http://sqlfiddle.com/#!6/8448e/6 [已更新]

http://sqlfiddle.com/#!6/d05fe/1

4 个答案:

答案 0 :(得分:3)

您可以使用窗口功能。我相信你基本上想要:

last_sender

这不太有效,因为您有月份名称 - 这些将按字母顺序排序。 SQL Server非常适合转换日期,所以这应该有效:

select t.*,
       sum(riskweight) over (partition by id, year, riskcategory
                             order by month
                            ) as accum_riskweight
from t;

答案 1 :(得分:3)

如果我做对了你真的想要这个:

SELECT
    ID,
    Year,
    Month,
    RiskWeight = SUM(MaxRiskweight) + 0.536
FROM (
    SELECT
        t1.ID,
        t1.Year,
        t1.Month,
        t2.RiskCategory,
        MaxRiskweight = MAX(t2.Riskwight)
    FROM
        inputTable AS t1
        JOIN inputTable AS t2
        ON t1.ID = t2.ID AND
           t1.Year = t2.Year AND
           t2.Month <= t1.Month
    GROUP BY
        t1.ID,
        t1.Year,
        t1.Month,
        t2.RiskCategory
    ) AS MaxRiskWeights
--WHERE
--  ID = 'XYZ'
GROUP BY
    ID,
    Year,
    Month

我评论了WHERE子句,因为我想你想为表中的每个ID计算它。常量0.536会添加到RiskWeight的每个汇总行,正如您在示例中给出的那样。

答案 2 :(得分:1)

select distinct id, year,month,SUM(riskweight) group by  ID,year,month

答案 3 :(得分:1)

您可以使用Sum和窗口函数,如下所示:

Dim MinAgeVal As Variant
MinAgeVal = DLookup("[MinAge]", "User_ProductDefaultsAge")

If IsNull(MinAgeVal) Then
    x = MsgBox("Missing Minimum Age Value", vbCritical)
Else
    x = MsgBox("clear", vbCritical)
End If

但是这里[月]顺序依次按字母顺序排列,最好在这个地方有月号