我试图找到答案,但也许我对MSSQL太陌生了,我来自MySQL,所以这是我的问题超级简化,直奔主题: 想象一下,我们有一个表格"事物">
妖怪 |价值 --------+------- 事物1 | 10 事物1 | 15 事物1 | 16
在MySQL中,我可以在查询中做这样的事情:
设置@halfvalue := 0; 选择事物,价值, (@halfvalue := 值/2(作为半值, (@halfvalue/2(作为一半一半 从
会返回
的东西妖怪 |价值 |半值 |半 --------+-------+-----------+------------ 事物1 | 10 | 5.00 | 2.50 事物1 | 15 | 7.50 | 3.75 事物1 | 16 | 8.00 | 4.00
看起来很简单,实际的有点复杂。 我的问题是,在MSSQL中我无法分配,并在同一个SELECT上使用变量。在这个简单的级别上,我找不到与此功能类似的内容。
有什么解决办法吗?
编辑,这是包含所有这些讨厌操作的选择:
SELECT
fvh.DocEntry,
MAX( fvs.SeriesName ) AS "Serie",
MAX( fvh.DocNum - 1000000 ) AS "Número",
MAX( fvh.DocDate ) AS "Fecha",
MAX( fvh.U_FacNit ) AS "NIT",
MAX( fvh.U_FacNom ) AS "Nombre",
MAX( IIF( ISNULL( fvh.Address, '' ) = '', fvh.Address2, fvh.Address ) ) AS "Dirección",
SUM( fvd.GTotal - ISNULL( ncd.GTotal, 0 ) ) AS "Total",
IIF( MAX( fvh.CANCELED ) = 'Y' OR ( SUM( fvd.GTotal - ISNULL( ncd.GTotal, 0 ) ) = 0 ),
'Anulada',
IIF( SUM( fvd.GTotal ) > SUM( ISNULL( ncd.GTotal, 0 ) ) AND ( SUM( ISNULL( ncd.GTotal, 0 ) ) > 0 ),
'Devuelta',
'Emitida' )
) AS "Estado",
ROUND( ( ( SUM( fvd.GTotal - ISNULL( ncd.GTotal, 0 ) ) / 1.12 ) * 0.12 ), 4 ) AS "IVA",
ROUND( SUM( IIF( fvd.U_TipoA = 'BB',
( fvd.GTotal - ISNULL( ncd.GTotal, 0 ) ) - ( ( ( fvd.GTotal - ISNULL( ncd.GTotal, 0 ) ) / 1.12 ) * 0.12 ),
0 ) ), 4) AS "Bien",
ROUND( SUM( IIF( fvd.U_TipoA = 'S',
( fvd.GTotal - ISNULL( ncd.GTotal, 0 ) ) - ( ( ( fvd.GTotal - ISNULL( ncd.GTotal, 0 ) ) / 1.12 ) * 0.12 ),
0 ) ), 4) AS "Servicio",
ROUND( SUM( IIF( fvd.U_TipoA = 'N',
( fvd.GTotal - ISNULL( ncd.GTotal, 0 ) ) - ( ( ( fvd.GTotal - ISNULL( ncd.GTotal, 0 ) ) / 1.12 ) * 0.12 ),
0 ) ), 4) AS "No Aplica",
COUNT(fvd.LineNum) AS "Lineas", SUM(fvd.GTotal) AS "FCTotal",
SUM(ISNULL( ncd.GTotal, 0 )) AS "NCTotal"
/* Facturas */
FROM OINV AS fvh
LEFT JOIN NNM1 AS fvs ON fvs.Series = fvh.Series
LEFT JOIN INV1 as fvd ON fvd.DocEntry = fvh.DocEntry
/* Notas de Credito */
LEFT JOIN RIN1 AS ncd ON ncd.BaseEntry = fvh.DocEntry AND ncd.LineNum = fvd.LineNum
WHERE fvh.DocDate BETWEEN ? AND ? /*AND fvh.DocEntry = 1108*/
GROUP BY fvh.DocEntry
谢谢大家抽出宝贵时间。我将拆除我的查询,并在考虑您的所有输入的情况下重新进行。格拉西亚斯,总计。
你认为你可以在MySQL中做到这一点:
SET @halfvalue := 0;
SELECT Thingie, Value,
(@halfvalue := Value / 2) AS HalfValue,
(@halfvalue / 2) AS HalfOfHalf
FROM Things;
但你错了。 为什么? MySQL - 与其他所有数据库一样 - 不保证SELECT
中表达式的计算顺序。 文档甚至警告了这一点:
在下面的语句中,您可能会认为MySQL将首先评估@a,然后再执行赋值:
SELECT @a, @a:=@a+1, ...;
但是,涉及用户变量的表达式的计算顺序未定义。
在这两个数据库中,都可以使用子查询。 在最新版本的MySQL(以及几乎任何其他数据库(中,您还可以使用CTE:
SELECT Thingie, Value, HalfValue,
(HalfValue / 2) AS HalfOfHalf
FROM (SELECT t.*, (Value / 2) AS HalfValue
FROM Things t
) t;
答案很简单:你不能在 MSSQL 中这样做,因为当你尝试它时,你会得到:
Msg 141,级别 15,状态 1,第 3 行 为变量赋值的 SELECT 语句不得与数据检索操作结合使用。
你最有可能经历过的。
最简单的解决方法是:
SELECT Thingie, Value, Value/2, Value/4 from Things
其他方法:
select Thingie, Value, HalfValue, HalfValue / 2 from (
SELECT Thingie, Value, Value / 2 HalfValue from Things
) a
不,这在 SQL 中不起作用。在查询完成之前,不会设置参数值。您可以通过两个步骤完成:
DECLARE @halfvalue FLOAT = 0;
SELECT @halfvalue = ([Value] / 2)
FROM Things ;
SELECT Thingie
, [Value]
, HalfValue = [Value]/2
, HalfAgainValue = @halfvalue / 2
FROM Things ;