【问题标题】:MONEY Datatype CAST issue in IIF or CASE clauseIIF 或 CASE 子句中的 MONEY 数据类型 CAST 问题
【发布时间】:2015-04-21 01:45:07
【问题描述】:

这是一个产生正确输出的示例查询示例:

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

正确的输出是:

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

如果我将 MONEY 更改为带有点的十进制价格:

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

感谢您的帮助!

【问题讨论】:

  • 这里有问题吗?
  • 你有SELECT ... T.price, T.price AS prev_price ...。为什么您希望 2 列显示不同的结果?
  • 详细说明我上面的尖刻评论......你想用你的 CTE 完成什么?关于第一组结果正确的情况是什么,为什么您的第二组结果不正确。就像现在一样,我们作为潜在的回答者必须推断您的意图,而不是向我们解释。
  • 它可以正常工作,没有价格中的点。我需要点,因为 MONEY 数据类型中的价格包含点。用点它工作不正确。这就是问题所在。 CTE 声明没问题。问题出在 IIF(或 CASE)中。可以是 CAST 到 DECIMAL 运算符之类的......
  • 那么,唯一的问题是,当表中 price 列包含 324.64 时,您要为 price 输出 32464.00,为 prev_price 输出 324.64?

标签: sql-server tsql case sqldatatypes


【解决方案1】:

这是因为3246432478' is more than 10, but the difference between324.64and324.78`之间的区别不是。更改此行:

IIF(ABS(TT.price - cte_tbl.prev_price1) < 10, cte_tbl.prev_price1, TT.price) 

到:

IIF(ABS(TT.price - cte_tbl.prev_price1) < 0.10, cte_tbl.prev_price1, TT.price)

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

【讨论】:

  • @GarethD 我认为这可能是问题所在,但我并不真正理解为什么一个结果集是正确的而另一个不是。如果他的值会有任何范围(比如 10 倍),那么发布的代码将继续适用于一组值,而不是另一组。
  • 这会在他的“输出应该是”代码块中产生准确的输出?请注意该块中 price 和 prev_price 之间的小数使用差异。
猜你喜欢
  • 2019-08-13
  • 1970-01-01
  • 2017-06-26
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
  • 2015-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多