Sql 在具有并集和联接的视图上使用CASE
我有一个问题,我已经做了几天了,但没有一个学校、微软等帮助处理这个特殊的案例。我不知道如何在以下情况下使案例有效:Sql 在具有并集和联接的视图上使用CASE,sql,sql-server,case,inner-join,union,Sql,Sql Server,Case,Inner Join,Union,我有一个问题,我已经做了几天了,但没有一个学校、微软等帮助处理这个特殊的案例。我不知道如何在以下情况下使案例有效: 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
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是一个返回单个值的表达式,这是多余的;这就是表达式的作用。因此,请使用它两次:
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不同,您可以计算一个条件并基于该比较返回一个值。类似的方式应该可以工作,尽管我现在无法测试它
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
案例表达式的结果是一列,您不能给它不同的别名将您的问题与您使用的数据库进行标记。案例表达式只返回一个值。这是我的错误,我习惯于VB/C,其中案例中的一个条件可以返回多个值。谢谢你的解释,一切都很好,但是你的解释指出了我的错误!