Sql server IIF或CASE子句中的货币数据类型转换问题

Sql server IIF或CASE子句中的货币数据类型转换问题,sql-server,tsql,case,sqldatatypes,Sql Server,Tsql,Case,Sqldatatypes,以下是生成正确输出的示例查询示例: DECLARE @T TABLE ( keydate DATE, price MONEY ); INSERT INTO @T(keydate, price) VALUES ('2014-07-23', 32464), ('2014-07-26', 32478), ('2014-07-27', 32473) ;WITH cte_tbl (keydate, price, prev_price1) AS ( SELECT TOP(1)

以下是生成正确输出的示例查询示例:

DECLARE @T TABLE (
    keydate DATE,
    price   MONEY
);

INSERT INTO @T(keydate, price) VALUES
('2014-07-23', 32464),
('2014-07-26', 32478),
('2014-07-27', 32473)


;WITH
cte_tbl (keydate, price, prev_price1)
AS (
SELECT TOP(1) 
    T.keydate,
    T.price,
    T.price AS prev_price
    FROM @T AS T
    ORDER BY T.keydate
UNION ALL
SELECT
    T.keydate,
    T.price,
    T.prev_price
    FROM (
    SELECT
        TT.keydate,
        TT.price,
        IIF(ABS(TT.price - cte_tbl.prev_price1) < 10, cte_tbl.prev_price1, TT.price) AS prev_price,
        ROW_NUMBER() OVER(ORDER BY TT.keydate) AS ROWNUM
        FROM @T AS TT
        INNER JOIN cte_tbl ON cte_tbl.keydate < TT.keydate
    ) AS T
    WHERE T.ROWNUM = 1
)

SELECT *
FROM cte_tbl 
ORDER BY keydate
如果我改为十进制价格,则持有带点的货币:

INSERT INTO @T(keydate, price) VALUES
('2014-07-23', 324.64),
('2014-07-26', 324.78),
('2014-07-27', 324.73)
输出将错误

keydate price   prev_price1
2014-07-23  324.64  324.64
2014-07-26  324.78  324.64
2014-07-27  324.73  324.64
价格实际上在CTE声明中,但它并不排斥混乱

我需要以正常价格存储它们,并具有如上所述的正确输出行为:

('2014-07-23', 324.64),
('2014-07-26', 324.78),
('2014-07-27', 324.73)
输出应为:

keydate price       prev_price1
2014-07-23  32464.00    324.64
2014-07-26  32478.00    324.78
2014-07-27  32473.00    324.78

谢谢你的帮助

这是因为
32464
32478'之间的差异大于10,但
324.64
324.78'之间的差异不显著。更改此行:

IIF(ABS(TT.price - cte_tbl.prev_price1) < 10, cte_tbl.prev_price1, TT.price) 
IIF(ABS(TT.price-cte_-tbl.prev_price 1)<10,cte_-tbl.prev_price 1,TT.price)
致:

IIF(ABS(TT.price-cte\U tbl.prev\U price 1)<0.10,cte\U tbl.prev\U price 1,TT.price)

如果要将价格降低10倍,则需要将比较降低10倍。

这是因为
32464
32478'之间的差异大于10,但
324.64
324.78'之间的差异不大于10。更改此行:

IIF(ABS(TT.price - cte_tbl.prev_price1) < 10, cte_tbl.prev_price1, TT.price) 
IIF(ABS(TT.price-cte_-tbl.prev_price 1)<10,cte_-tbl.prev_price 1,TT.price)
致:

IIF(ABS(TT.price-cte\U tbl.prev\U price 1)<0.10,cte\U tbl.prev\U price 1,TT.price)

如果要将价格降低10倍,则需要将比较降低10倍。

这是因为
32464
32478'之间的差异大于10,但
324.64
324.78'之间的差异不大于10。更改此行:

IIF(ABS(TT.price - cte_tbl.prev_price1) < 10, cte_tbl.prev_price1, TT.price) 
IIF(ABS(TT.price-cte_-tbl.prev_price 1)<10,cte_-tbl.prev_price 1,TT.price)
致:

IIF(ABS(TT.price-cte\U tbl.prev\U price 1)<0.10,cte\U tbl.prev\U price 1,TT.price)

如果要将价格降低10倍,则需要将比较降低10倍。

这是因为
32464
32478'之间的差异大于10,但
324.64
324.78'之间的差异不大于10。更改此行:

IIF(ABS(TT.price - cte_tbl.prev_price1) < 10, cte_tbl.prev_price1, TT.price) 
IIF(ABS(TT.price-cte_-tbl.prev_price 1)<10,cte_-tbl.prev_price 1,TT.price)
致:

IIF(ABS(TT.price-cte\U tbl.prev\U price 1)<0.10,cte\U tbl.prev\U price 1,TT.price)


如果您要将价格降低10倍,您需要将比较降低10倍。

这里有什么问题吗?您有
选择。。。T.price,T.price作为上一个价格…
。为什么你认为这两个专栏会显示不同的结果?为了详细说明我在上面的尖刻评论。。。你想用你的CTE完成什么?第一组正确的结果是什么?第二组错误的原因是什么。现在,作为潜在的回答者,我们必须推断出你的意图,而不是向我们解释。它在没有价格点的情况下是正确的。我需要点,因为货币价格数据类型包含点。对于圆点,它工作不正确。这就是问题所在。CTE声明没有问题。问题在于IIF(或案例)。可以转换为十进制运算符或其他形式…因此,唯一的问题是,当表在price列中包含324.64时,您希望输出32464.00作为price,324.64作为prev_price?这里有什么问题吗?您有
选择。。。T.price,T.price作为上一个价格…
。为什么你认为这两个专栏会显示不同的结果?为了详细说明我在上面的尖刻评论。。。你想用你的CTE完成什么?第一组正确的结果是什么?第二组错误的原因是什么。现在,作为潜在的回答者,我们必须推断出你的意图,而不是向我们解释。它在没有价格点的情况下是正确的。我需要点,因为货币价格数据类型包含点。对于圆点,它工作不正确。这就是问题所在。CTE声明没有问题。问题在于IIF(或案例)。可以转换为十进制运算符或其他形式…因此,唯一的问题是,当表在price列中包含324.64时,您希望输出32464.00作为price,324.64作为prev_price?这里有什么问题吗?您有
选择。。。T.price,T.price作为上一个价格…
。为什么你认为这两个专栏会显示不同的结果?为了详细说明我在上面的尖刻评论。。。你想用你的CTE完成什么?第一组正确的结果是什么?第二组错误的原因是什么。现在,作为潜在的回答者,我们必须推断出你的意图,而不是向我们解释。它在没有价格点的情况下是正确的。我需要点,因为货币价格数据类型包含点。对于圆点,它工作不正确。这就是问题所在。CTE声明没有问题。问题在于IIF(或案例)。可以转换为十进制运算符或其他形式…因此,唯一的问题是,当表在price列中包含324.64时,您希望输出32464.00作为price,324.64作为prev_price?这里有什么问题吗?您有
选择。。。T.price,T.price作为上一个价格…
。为什么你认为这两个专栏会显示不同的结果?为了详细说明我在上面的尖刻评论。。。你想用你的CTE完成什么?第一组正确的结果是什么?第二组错误的原因是什么。现在,作为潜在的回答者,我们必须推断出你的意图,而不是向我们解释。它在没有价格点的情况下是正确的。我需要点,因为货币价格数据类型包含点。对于圆点,它工作不正确。这就是问题所在。CTE声明没有问题。问题在于IIF(或案例)。可以转换为十进制运算符或其他形式…所以,唯一的问题是,当表在price列中包含324.64时,您希望为price输出32464.00,为prev_price输出324.64?@GarethD我认为这可能是问题所在,但我并不真正理解为什么会有一个结果