Crystal 报告:用于提取满足其他特定条件的数据点的公式
Crystal Reports: Formula to pull data point where other specific criteria are met
我敢肯定这是一个非常简单的公式,但我对 CR 很陌生并且遇到了困难...所以搜索了我的答案但找不到它,所以请原谅我,如果这已被问得令人作呕。
我有一份患者名单,每年都会为一名患者分配一个风险评分,因此每位患者都有多个评分。数据看起来像这样:
Patient_ID Score_Year Risk_Score
11111 2013 1.05
11111 2014 0.00
22222 2013 0.07
22222 2014 0.11
33333 2013 1.19
33333 2014 0.00
44444 2013 2.13
44444 2014 0.00
55555 2013 0.30
55555 2014 0.54
66666 2013 1.67
66666 2014 2.31
我想创建一个字段,为每位患者分配一个风险评分,但正如您从数据中看到的那样,一些患者在 2014 年的评分为“0.00”,我不想包括在内。
我的想法是创建一个公式,基本上说明 if [Score_Year] = 2014 and [Risk_Score] <> 0 then ([Risk_Score] where [Score_Year] = 2014) else ([Risk_Score] 其中 [Score_Year] = 2013) 但碰壁了。
简而言之,我需要一个公式来首先提取 2014 年的分数,但如果该分数为 0,则默认为 2013 年。
有没有办法将其写成公式,或者 select 情况会更好吗?这就是我对 CR 的了解,所以如果你们知道任何更有效的方法,我很乐意学习!
前两个可能会用作 SQL 表达式,尽管它们可能会很慢。主要好处是计算值是数据集的一部分,可以在渲染过程的所有过程中使用。
(
select coalesce(max(Score_Year * 1000 + Risk_Score * 100.00) % 1000 / 100.00, 0.00)
from table T2
where (Score_Year <> 2014 or Risk_Score <> 0.00) and T2.Patient_ID = T.Patient_ID
) -- better to say year(getdate()) - 1 instead of hardcoding 2014??
这个不是黑客,但只适用于 SQL 服务器(或者可能是 Sybase)。类似的方法适用于 Oracle、DB2 等。
coalesce(
(
select top 1 Risk_Score
from table T2
where Risk_Score <> 0.00 and T2.Patient_ID = T.Patient_ID
order by Score_Year desc
),
0.00
)
这是一个可以给出正确值的 Crystal 公式(不过我可能对语法不太熟悉。)您需要在 [=24= 上有一个 Crystal 组] 然后将公式放在详细信息部分并取消它。然后您可以在组页脚的任何位置使用该公式并返回正确的值。
// @RiskScore
whileprintingrecords;
static numbervar patient_id :: 0;
static numbervar risk_score := 0.00;
static numbervar score_year := 1900;
if (
risk_score = 0.00 and score_year < {T.Score_Year} or
patient_id <> {T.Patient_ID}
) then (
patient_id := {T.Patient_ID};
risk_score := {T.Risk_Score};
score_year := {T.Score_Year};
)
risk_score;
按照第一个 SQL 表达式的模式,您可以将其转换为一对公式。这里的缺点是风险评分不可用于行级 (whilereadingrecords) 公式。
// @WeightedRiskScore
{T.Score_Year} * 1000 + {T.Risk_Score} * 100.00;
// @MostRecentRiskScore
max(@WeightedRiskSCore, "Patient_ID") mod 1000 / 100.00;
根据您报告的具体情况,可能还有其他选项。
我敢肯定这是一个非常简单的公式,但我对 CR 很陌生并且遇到了困难...所以搜索了我的答案但找不到它,所以请原谅我,如果这已被问得令人作呕。
我有一份患者名单,每年都会为一名患者分配一个风险评分,因此每位患者都有多个评分。数据看起来像这样:
Patient_ID Score_Year Risk_Score
11111 2013 1.05
11111 2014 0.00
22222 2013 0.07
22222 2014 0.11
33333 2013 1.19
33333 2014 0.00
44444 2013 2.13
44444 2014 0.00
55555 2013 0.30
55555 2014 0.54
66666 2013 1.67
66666 2014 2.31
我想创建一个字段,为每位患者分配一个风险评分,但正如您从数据中看到的那样,一些患者在 2014 年的评分为“0.00”,我不想包括在内。
我的想法是创建一个公式,基本上说明 if [Score_Year] = 2014 and [Risk_Score] <> 0 then ([Risk_Score] where [Score_Year] = 2014) else ([Risk_Score] 其中 [Score_Year] = 2013) 但碰壁了。
简而言之,我需要一个公式来首先提取 2014 年的分数,但如果该分数为 0,则默认为 2013 年。
有没有办法将其写成公式,或者 select 情况会更好吗?这就是我对 CR 的了解,所以如果你们知道任何更有效的方法,我很乐意学习!
前两个可能会用作 SQL 表达式,尽管它们可能会很慢。主要好处是计算值是数据集的一部分,可以在渲染过程的所有过程中使用。
(
select coalesce(max(Score_Year * 1000 + Risk_Score * 100.00) % 1000 / 100.00, 0.00)
from table T2
where (Score_Year <> 2014 or Risk_Score <> 0.00) and T2.Patient_ID = T.Patient_ID
) -- better to say year(getdate()) - 1 instead of hardcoding 2014??
这个不是黑客,但只适用于 SQL 服务器(或者可能是 Sybase)。类似的方法适用于 Oracle、DB2 等。
coalesce(
(
select top 1 Risk_Score
from table T2
where Risk_Score <> 0.00 and T2.Patient_ID = T.Patient_ID
order by Score_Year desc
),
0.00
)
这是一个可以给出正确值的 Crystal 公式(不过我可能对语法不太熟悉。)您需要在 [=24= 上有一个 Crystal 组] 然后将公式放在详细信息部分并取消它。然后您可以在组页脚的任何位置使用该公式并返回正确的值。
// @RiskScore
whileprintingrecords;
static numbervar patient_id :: 0;
static numbervar risk_score := 0.00;
static numbervar score_year := 1900;
if (
risk_score = 0.00 and score_year < {T.Score_Year} or
patient_id <> {T.Patient_ID}
) then (
patient_id := {T.Patient_ID};
risk_score := {T.Risk_Score};
score_year := {T.Score_Year};
)
risk_score;
按照第一个 SQL 表达式的模式,您可以将其转换为一对公式。这里的缺点是风险评分不可用于行级 (whilereadingrecords) 公式。
// @WeightedRiskScore
{T.Score_Year} * 1000 + {T.Risk_Score} * 100.00;
// @MostRecentRiskScore
max(@WeightedRiskSCore, "Patient_ID") mod 1000 / 100.00;
根据您报告的具体情况,可能还有其他选项。