MySQL在MSSQL中等效于分配变量并使用它



我试图找到答案,但也许我对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 ;

最新更新