在具有 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
我有一个查询已经处理了几天,教程(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