我在为以下要求生成正确的方法/查询时面临一些设计和逻辑问题。
我的主要表是
从[table]中选择*,其中ID =' XYZ'
现在我按照以下要求计算累积的风险权重,我需要写一个逻辑
条件:
同年的每个月
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月的风险权重,那么我们应该只考虑以下行
**因为我没有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
,最终结果表应为
请检查sqlfiddle
答案 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
但是这里[月]顺序依次按字母顺序排列,最好在这个地方有月号