Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在具有并集和联接的视图上使用CASE_Sql_Sql Server_Case_Inner Join_Union - Fatal编程技术网

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,其中案例中的一个条件可以返回多个值。谢谢你的解释,一切都很好,但是你的解释指出了我的错误!