需要帮助将继承的 excel 公式转换为 SQL 或 DAX
Posted
技术标签:
【中文标题】需要帮助将继承的 excel 公式转换为 SQL 或 DAX【英文标题】:Need help translating an inherited excel formula to SQL or DAX 【发布时间】:2017-06-02 15:19:14 【问题描述】:我很难理解这个旨在计算 ASCVD 风险的继承公式中的逻辑。数据在 PowerBI 中处理之前在 SQL 数据库中进行处理(使用模糊逻辑匹配记录),所以如果有一个首选的地方来处理它,我可以选择其中任何一个。
=IF(
OR(
(AGE)<40,
(AGE)>79,
(TCRow)<130,
(TCRow)>320,
(HDLRow)<20,
(HDLRow)>100,
(BPSystolicRow)<90,
(BPSystolicRow)>200,
AND((DiabetesRow)="",
(DiabetesRowNo)=""),
AND((ONBPMEDICATIONROW)="",
(OFFBPMEDICATIONROW)=""),
AND((SmokerRow)="",
(SmokingRowNo)="")), "",
IFERROR(IF((GenderFemaleRow)=1, 1-0.9665^(EXP
(((SUM(LN((AGE))*-29.799,
LN((AGE))^2*4.884,
LN((TCRow))*13.54,
LN((AGE))*LN((TCRow))*-3.114,
LN((HDLRow))*-13.578,
LN(D3)*LN((HDLRow))*3.149,
IF((ONBPMEDICATIONROW)=1,
ROUND(LN((BPSystolicRow))*2.019, 2),
LN((BPSystolicRow))*1.957),
IF((SmokerRow)=1, 7.574, 0),
ROUND(LN((AGE))*IF((SmokerRow)=1, -1.665, 0), 3),
IF((DiabetesRow)=1, 0.661, 0)))-(-29.18)))), 1-0.9144^(EXP((SUM(LN((AGE))*12.344,
LN((TCRow))*11.853,
LN((AGE))*LN((TCRow))*-2.664,
LN((HDLRow))*-7.99,
LN((AGE))*LN((HDLRow))*1.769,
IF((ONBPMEDICATIONROW)=1,
LN((BPSystolicRow))*1.797,
LN((BPSystolicRow))*1.764),
IF((SmokerRow)=1, 7.837, 0),
IF((SmokerRow)=1,
LN((AGE))*-1.795, 0),
IF((DiabetesRow)=1, 0.658, 0))-(61.18))))), ""))
【问题讨论】:
哇。关于这应该做什么的任何文件?如果没有对预期行为的规范,我将非常不愿意简单地依赖它并尝试将其转换为其他东西。 @dan1111 尤其是因为它看起来被用来给患者开糖尿病药物……在没有明确的要求或逻辑的情况下将其转换为另一种语言真的很冒险。 不被用来开任何处方……它被用来计算聚合人口分析的风险。不幸的是,我没有任何关于用于创建此公式的过程的文档,也无法在互联网上找到任何关于 ASCVD 风险的公式指南。 如果有人在没有文档的情况下写了这么一大堆乱七八糟的东西,那么规则 #1 不要假设它没有错误。 【参考方案1】:我会试一试的。简而言之,公式说:
=IF(ParametersOutOfRangeOrMissing,"",CalculateRisk)
所以如果某些数据超出范围或丢失,则返回“”,否则计算风险。
ParametersOutOfRangeOrMissing
是一项检查,以确保所有必要的数据都可用并且数据在风险计算有效的范围内。这是一个很大的OR
声明说,如果存在多种情况中的任何一种(太年轻、太老、收缩压过高或过低等),则此风险计算不适用。这部分公式为:
OR(
(AGE)<40, (AGE)>79,
(TCRow)<130, (TCRow)>320,
(HDLRow)<20, (HDLRow)>100,
(BPSystolicRow)<90, (BPSystolicRow)>200,
AND(
(DiabetesRow)="", (DiabetesRowNo)=""
),
AND(
(ONBPMEDICATIONROW)="", (OFFBPMEDICATIONROW)=""
),
AND(
(SmokerRow)="", (SmokingRowNo)="")
)
公式的CalculateRisk
部分是这样的:
CalculateRisk = IFERROR(AttemptRiskCalculation,"")
所以如果计算过程中出现错误返回"",否则返回计算的风险。
AttemptRiskCalculation
是基于性别的:
IF((GenderFemaleRow)=1,FemaleRisk,MaleRisk)
这里我假设(GenderFemaleRow)=1
表示女性,但也可能是男性。
女性和男性风险的公式相似,但不一样。以下是女性的风险:
FemaleRisk=1-0.9665^(EXP(((SUM(
LN((AGE))*-29.799,
LN((AGE))^2*4.884,
LN((TCRow))*13.54,
LN((AGE))*LN((TCRow))*-3.114,
LN((HDLRow))*-13.578,
LN(D3)*LN((HDLRow))*3.149,
IF(
(ONBPMEDICATIONROW)=1,
ROUND(LN((BPSystolicRow))*2.019, 2),
LN((BPSystolicRow))*1.957
),
IF((SmokerRow)=1, 7.574, 0),
ROUND(LN((AGE))*IF((SmokerRow)=1, -1.665, 0), 3),
IF((DiabetesRow)=1, 0.661, 0)
))-(-29.18))))
对于男性:
MaleRisk=1-0.9144^(EXP((SUM(
LN((AGE))*12.344,
LN((TCRow))*11.853,
LN((AGE))*LN((TCRow))*-2.664,
LN((HDLRow))*-7.99,
LN((AGE))*LN((HDLRow))*1.769,
IF(
(ONBPMEDICATIONROW)=1,
LN((BPSystolicRow))*1.797,
LN((BPSystolicRow))*1.764
),
IF((SmokerRow)=1, 7.837, 0),
IF((SmokerRow)=1, LN((AGE))*-1.795, 0),
IF((DiabetesRow)=1, 0.658, 0)
)-(61.18))))
希望有帮助
【讨论】:
干得好!很好地解释了它,你实际上让我相信我上面的 cmets 有点过于悲观了。 这真的很有帮助,感谢您花时间回答!以上是关于需要帮助将继承的 excel 公式转换为 SQL 或 DAX的主要内容,如果未能解决你的问题,请参考以下文章
Oracle SQL:将当前行和前两行的excel嵌套if条件转换为SQL
SQL 新手。想将 IF(COUNTIFS()) Excel 公式转换为 SQL 代码并让 SQL 计算它而不是 Excel