在具有 UNION 和 JOINS 的视图上使用 CASE

Using CASE on a view with UNION and JOINS

我有一个查询已经处理了几天,教程(w3school、ms 等)的 none 正在帮助解决这个特殊情况。我不知道如何让 CASE 在以下方面工作:

SELECT T2.SlpName, T0.CardName, T0.DocNum, T0.DocType, T0.DocTotal,
CASE  T0.CANCELED WHEN 'N' THEN 
(T0.DocTotal - T0.VatSum - T0.TotalExpns) As "Total du document sans TVA",
SUM(T1.LineTotal * (T1.Commission / 100)) As "Total des commissions"
ELSE
((T0.DocTotal - T0.VatSum - T0.TotalExpns) * -1) As "Total du document sans TVA",
(SUM(T1.LineTotal * (T1.Commission / 100)) * -1) As "Total des commissions"
END
FROM OINV T0  
INNER JOIN INV1 T1 ON T0.DocEntry = T1.DocEntry
INNER JOIN OSLP T2 ON T0.SlpCode = T2.SlpCode 
--WHERE T2.SlpName = N'[%0]' 
--AND T0.DocDate >= '[%1]' 
--AND T0.DocDate <= '[%2]'
GROUP BY T2.SlpName, T0.CardName, T0.DocNum, T0.DocType, T0.DocTotal, T0.VatSum, T0.TotalExpns, T0.CANCELED

UNION ALL

SELECT T2.SlpName, T0.CardName, T0.DocNum, T0.DocType, T0.DocTotal * -1, T0.CANCELED,
(T0.DocTotal - T0.VatSum - T0.TotalExpns) * -1 As "Total du document sans TVA",
SUM(T1.LineTotal * (T1.Commission / 100)) * -1 As "Total des commissions"
FROM ORIN T0  
INNER JOIN RIN1 T1 ON T0.DocEntry = T1.DocEntry
INNER JOIN OSLP T2 ON T0.SlpCode = T2.SlpCode 
--WHERE T2.SlpName = N'[%0]' 
--AND T0.DocDate >= '[%1]' 
--AND T0.DocDate <= '[%2]'
GROUP BY T2.SlpName, T0.CardName, T0.DocNum, T0.DocType, T0.DocTotal, T0.VatSum, T0.TotalExpns , T0.CANCELED
ORDER BY SlpName, DocNum

我尝试了此查询的多种变体,但均无济于事。谢谢大家的帮助

case 是 returns 单个值的表达式(好吧,这是多余的;这就是表达式的作用)。所以,使用它两次:

SELECT T2.SlpName, T0.CardName, T0.DocNum, T0.DocType, T0.DocTotal,
       (CASE WHEN T0.CANCELED = 'N'
             THEN (T0.DocTotal - T0.VatSum - T0.TotalExpns)
             ELSE (SUM(T1.LineTotal * (T1.Commission / 100)) * -1)
        END) As "Total du document sans TVA",
       (CASE WHEN T0.CANCELED = 'N'
             THEN SUM(T1.LineTotal * (T1.Commission / 100))
             ELSE (SUM(T1.LineTotal * (T1.Commission / 100)) * -1)
        END) As "Total des commissions"

我认为您正在寻找这样的东西:

CASE  T0.CANCELED WHEN 'N' THEN 
(T0.DocTotal - T0.VatSum - T0.TotalExpns)
ELSE
((T0.DocTotal - T0.VatSum - T0.TotalExpns) * -1) 
END As "Total du document sans TVA",
CASE  T0.CANCELED WHEN 'N' THEN 
SUM(T1.LineTotal * (T1.Commission / 100))
ELSE
(SUM(T1.LineTotal * (T1.Commission / 100)) * -1)
END As "Total des commissions"

CASE 在过程语言中的工作方式与 if 不同,您可以根据该比较评估条件和 return 值。

类似这样的东西应该可以工作,但我现在无法测试它。

SELECT T2.SlpName, T0.CardName, T0.DocNum, T0.DocType, T0.DocTotal, T0.CANCELED,
CASE  T0.CANCELED WHEN 'N' THEN (T0.DocTotal - T0.VatSum - T0.TotalExpns) ELSE ((T0.DocTotal - T0.VatSum - T0.TotalExpns) * -1) END As "Total du document sans TVA",
CASE  T0.CANCELED WHEN 'N' THEN SUM(T1.LineTotal * (T1.Commission / 100)) ELSE (SUM(T1.LineTotal * (T1.Commission / 100)) * -1) END As "Total des commissions"

FROM OINV T0  
INNER JOIN INV1 T1 ON T0.DocEntry = T1.DocEntry
INNER JOIN OSLP T2 ON T0.SlpCode = T2.SlpCode 
--WHERE T2.SlpName = N'[%0]' 
--AND T0.DocDate >= '[%1]' 
--AND T0.DocDate <= '[%2]'
GROUP BY T2.SlpName, T0.CardName, T0.DocNum, T0.DocType, T0.DocTotal, T0.VatSum, T0.TotalExpns, T0.CANCELED

UNION ALL


SELECT T2.SlpName, T0.CardName, T0.DocNum, T0.DocType, T0.DocTotal * -1 as T0.DocTotal, T0.CANCELED,
(T0.DocTotal - T0.VatSum - T0.TotalExpns) * -1 As "Total du document sans TVA",
SUM(T1.LineTotal * (T1.Commission / 100)) * -1 As "Total des commissions"
FROM ORIN T0  
INNER JOIN RIN1 T1 ON T0.DocEntry = T1.DocEntry
INNER JOIN OSLP T2 ON T0.SlpCode = T2.SlpCode 
--WHERE T2.SlpName = N'[%0]' 
--AND T0.DocDate >= '[%1]' 
--AND T0.DocDate <= '[%2]'
GROUP BY T2.SlpName, T0.CardName, T0.DocNum, T0.DocType, T0.DocTotal, T0.VatSum, T0.TotalExpns , T0.CANCELED
ORDER BY SlpName, DocNum