将Excel公式转换为SQL Case
早上好,斯塔克,我需要一些主要的帮助 我必须将EXCEL公式转换为SQL案例。 当我到达最后一段时,整个事情就一直在我身上分崩离析。我一辈子都想不出如何正确地设置它,我已经厌倦了因为它而被踢到全国广告部 我的主要问题是excel如何处理它的If/then的多个Else药剂 以下是Excel:将Excel公式转换为SQL Case,sql,sql-server,excel,Sql,Sql Server,Excel,早上好,斯塔克,我需要一些主要的帮助 我必须将EXCEL公式转换为SQL案例。 当我到达最后一段时,整个事情就一直在我身上分崩离析。我一辈子都想不出如何正确地设置它,我已经厌倦了因为它而被踢到全国广告部 我的主要问题是excel如何处理它的If/then的多个Else药剂 以下是Excel: =IF(AND(W7+H7<=0,IF(E7-H7-S7>0,E7-H7-S7,0)<=0),0,IF(W7+H7<IF(E7-H7-S7>0,E7-H7-S7,0),IF(W
=IF(AND(W7+H7<=0,IF(E7-H7-S7>0,E7-H7-S7,0)<=0),0,IF(W7+H7<IF(E7-H7-S7>0,E7-H7-S7,0),IF(W7+H7<0,0,W7+H7),IF(E7-H7-S7>0,IF(W7>H7,E7-S7,H7+AF7),H7)))
以下是我到目前为止所做的SQL案例:
它被设计成一个外部应用程序的一部分,因为我在自己的外部应用程序中处理所有数学部分。这样,我后面的任何人都会发现代码被正确地分割和记录
SELECT (CASE
WHEN CAST(tmpdc1.[14]AS decimal(10,2))+(CAST(tmpdc1.[3]AS Decimal (10,2)) + CAST(tmpdc1.[5]AS Decimal (10,2))) <= 0
AND (CASE WHEN(TotInChar.TotInChar -(CAST(tmpdc1.[3]AS Decimal (10,2)) + CAST(tmpdc1.[5]AS Decimal (10,2)))- T4MathBlock.TTIV) >0
THEN TotInChar.TotInChar -(CAST(tmpdc1.[3]AS Decimal (10,2)) + CAST(tmpdc1.[5]AS Decimal (10,2)))- T4MathBlock.TTIV
ELSE '0.00' END) <=0 THEN '0.00'
/* part 2*/
WHEN CAST(tmpdc1.[14] AS decimal(10,2))+(CAST(tmpdc1.[3]AS Decimal (10,2)) + CAST(tmpdc1.[5]AS Decimal (10,2)))
<
(CASE WHEN (TotInChar.TotInChar -(CAST(tmpdc1.[3]AS Decimal (10,2)) + CAST(tmpdc1.[5]AS Decimal (10,2)))- T4MathBlock.TTIV)
> 0
THEN TotInChar.TotInChar -(CAST(tmpdc1.[3]AS Decimal (10,2)) + CAST(tmpdc1.[5]AS Decimal (10,2)))- T4MathBlock.TTIV
ELSE '0.00'
END)
THEN (TotInChar.TotInChar -(CAST(tmpdc1.[3]AS Decimal (10,2)) + CAST(tmpdc1.[5]AS Decimal (10,2)))- T4MathBlock.TTIV)
/*Part 3*/
WHEN CAST(tmpdc.[14]AS decimal(10,2))+CAST(tmpdc.[3]AS Decimal (10,2)) + CAST(tmpdc.[5]AS Decimal (10,2))
< 0 THEN '0.00'
ELSE (CAST(tmpdc.[14]AS decimal(10,2))+CAST(tmpdc.[3]AS Decimal (10,2)) + CAST(tmpdc.[5]AS Decimal (10,2)))
/*Part 4*/
WHEN TotInChar.TotInChar -(CAST(tmpdc1.[3]AS Decimal (10,2)) + CAST(tmpdc1.[5]AS Decimal (10,2)))- T4MathBlock.TTIV
> 0 THEN
(CASE(CAST(tmpdc.[14]AS decimal(10,2)) > CAST(tmpdc.[3]AS Decimal (10,2)) + CAST(tmpdc.[5]AS Decimal (10,2))
THEN TotInChar.TotInChar - T4MathBlock.TTIV ELSE '0.00')
ELSE CAST(tmpdc.[3]AS Decimal (10,2)) + CAST(tmpdc.[5]AS Decimal (10,2)))
End
End) AS[ANT4]
From #TempDisclosure tmpdc1
WHERE tmpdc1.[Number] = Tmpdc.[Number]
谢谢你在这方面提供的任何帮助,我已经做了大约10个小时了,我的大脑很痛。
假设所有的都是整数,来描述这个例子。铸造的细节将在稍后公布。
目前,您的解决方案非常混乱,无法验证它是否与Excel公式匹配。快速匹配显示最后一节中可能有错误 你有这个:
WHEN TotInChar.TotInChar -(CAST(tmpdc1.[3]AS Decimal (10,2)) + CAST(tmpdc1.[5]AS Decimal (10,2)))- T4MathBlock.TTIV
> 0 THEN
(CASE(CAST(tmpdc.[14]AS decimal(10,2)) > CAST(tmpdc.[3]AS Decimal (10,2)) + CAST(tmpdc.[5]AS Decimal (10,2))
THEN TotInChar.TotInChar - T4MathBlock.TTIV ELSE '0.00')
ELSE CAST(tmpdc.[3]AS Decimal (10,2)) + CAST(tmpdc.[5]AS Decimal (10,2)))
End
试试这个:
WHEN TotInChar.TotInChar -(CAST(tmpdc1.[3]AS Decimal (10,2)) + CAST(tmpdc1.[5]AS Decimal (10,2)))- T4MathBlock.TTIV
> 0 THEN
(CASE(CAST(tmpdc.[14]AS decimal(10,2)) > CAST(tmpdc.[3]AS Decimal (10,2)) + CAST(tmpdc.[5]AS Decimal (10,2)))
THEN TotInChar.TotInChar - T4MathBlock.TTIV ELSE '0.00'
ELSE CAST(tmpdc.[3]AS Decimal (10,2)) + CAST(tmpdc.[5]AS Decimal (10,2)))
End
下面是一些我用来分解它的伪代码
DECLARE a int;
DECLARE b int;
SET a = (W7 + H7);
SET b = (E7 - H7 - S7);
IF (b < 0) THEN b = 0;
IF (a <= 0 AND b <= 0) THEN BEGIN
0
END ELSE BEGIN
IF (a < b) THEN BEGIN
IF (a < 0) THEN BEGIN
0
END ELSE BEGIN
a
END
END ELSE BEGIN
IF (b > 0) THEN BEGIN
IF (W7 > H7) THEN BEGIN
E7 - S7
END ELSE BEGIN
H7 + AF7
END
END ELSE BEGIN
H7
END
END
END
我建议重新开始。一次只做一步,一旦你有了一个单独的部分,就别管它了。是的,我已经做过几次了,以上是我第四次尝试整件事。在这一点上,我需要对它的另一套眼睛,因为我越来越墙眼睛。我们以前都来过这里,你只需要走开,让其他人说嘿,伙计,你忘了a或类似的东西。“其他多种药剂”,嗯?我建议在尝试生成相应的SQL之前将Excel公式翻译成英文/伪代码。是的,我有,我没有提供,我不想发布比我已经发布的更大的文本墙。我将在“现在”中编辑它。我再次开始将每个部分作为外部应用来执行,然后拉入“选择值进行比较”。但在这样做的过程中,我遇到了另一个错误,因此我再次退出,尝试从使用外部应用程序转移到在上主选择中进行比较。如果我没有记错,我无法在外部应用程序中放置Declare/Set。如果我错了,请纠正我。@user1949329正确,我只是解决了你的问题的一部分,不得不做一些其他的事情。与其放弃我所拥有的,不如把它贴出来。好吧,我很感激你的回复,我现在正在努力处理它。我正在接受你的帖子,并将其转换为一系列外部应用程序。然后我就可以用内在的参照来做这个例子。应该会更容易。如果这可行,我将稍后发布。感谢you@user1949329你可以看到,大部分的复杂性实际上是倒退到0。是的,实际上你的帖子让我重新思考了我迄今为止写的400多行。我现在要走了,但我将在周一重做整个代码集。我想从长远来看,这对我来说会更好。以你的例子为指导,我将改变所有的数学是如何在这篇文章中完成的,然后根据需要引用这些方程组。
DECLARE a int;
DECLARE b int;
SET a = (W7 + H7);
SET b = (E7 - H7 - S7);
IF (b < 0) THEN b = 0;
IF (a <= 0 AND b <= 0) THEN BEGIN
0
END ELSE BEGIN
IF (a < b) THEN BEGIN
IF (a < 0) THEN BEGIN
0
END ELSE BEGIN
a
END
END ELSE BEGIN
IF (b > 0) THEN BEGIN
IF (W7 > H7) THEN BEGIN
E7 - S7
END ELSE BEGIN
H7 + AF7
END
END ELSE BEGIN
H7
END
END
END