【问题标题】:Select query using variable not running in mssql使用未在 mssql 中运行的变量选择查询
【发布时间】:2015-12-16 21:52:27
【问题描述】:

在 MSSQL2014 中使用变量时选择查询不起作用 我的架构是:-

    CREATE TABLE product 
    (idproduct int, name varchar(50), description varchar(50), tax decimal(18,0))


INSERT INTO product
    (idproduct, name, description,tax)
VALUES
    (1, 'abc', 'This is abc',10),
    (2, 'xyz', 'This is xyz',20),
    (3, 'pqr', 'This is pqr',15)


CREATE TABLE product_storage 
    (idstorage int,idproduct int,added datetime, quantity int, price decimal(18,0))


INSERT INTO product_storage 
    (idstorage,idproduct, added, quantity,price)
VALUES
    (1, 1, 2010-01-01,0,10.0),
    (2, 1, 2010-01-02,0,11.0),
    (3, 1, 2010-01-03,10,12.0),
    (4, 2, 2010-01-04,0,12.0),
    (5, 2, 2010-01-05,10,11.0),
(6, 2, 2010-01-06,10,13.0),
(7, 3, 2010-01-07,10,14.0),
(8, 3, 2010-01-07,10,16.0),
(9, 3, 2010-01-09,10,13.0)

我正在执行以下命令:-

declare @price1 varchar(10)


SELECT p.idproduct, p.name, p.tax,
[@price1]=(SELECT top 1 s.price
        FROM product_storage s
        WHERE s.idproduct=p.idproduct AND s.quantity > 0
        ORDER BY s.added ASC),
 (@price1 * (1 + tax/100)) AS [price_with_tax]
FROM product p

;

这在 MSSQL 中不起作用,请帮帮我。 详情查看http://sqlfiddle.com/#!6/91ec2/296

我的查询在 MYSQL 中运行 检查详细信息:- http://sqlfiddle.com/#!9/a71b8/1

【问题讨论】:

  • 一个好问题的好例子,感谢小提琴

标签: sql-server variables select


【解决方案1】:

试试这个查询

SELECT 
    p.idproduct
    , p.name
    , p.tax
    , (t1.price * (1 + tax/100)) AS [price_with_tax]
FROM product p
inner join 
(
    SELECT ROW_NUMBER() over (PARTITION by s.idproduct order by s.added ASC) as linha, s.idproduct, s.price 
    FROM product_storage s
    WHERE s.quantity > 0    
) as t1
    on t1.idproduct = p.idproduct and t1.linha = 1

【讨论】:

  • 此查询也没有给出最后一行的正确结果,请检查 MYSQL 查询
  • 最后一行(产品 3)有两个相同的日期(2010-01-07)。您需要在查询中添加另一个条件(排序依据)或添加带有日期的时间。例如2010-01-07 10:00:00 和 2010-01-07 15:32:00
  • 但是在 MYSQL 中使用相同的架构检查这个:- sqlfiddle.com/#!9/a71b8/1
  • 我用相同的日期(2010-01-07)更新了插入到 product_storage 中的最后一行,结果不同。检查这个sqlfiddle.com/#!9/964730/1
  • 您好,Fiddle 中字面插入的日期存在问题,认为存在某种减法 int 值而不是解析日期...
【解决方案2】:

试试这样:

说明:您不能“即时”使用变量,但可以在 APPLY 中进行逐行计算...

SELECT p.idproduct, p.name, p.tax,
       Price.price1,
       (price1 * (1 + tax/100)) AS [price_with_tax]
FROM product p
CROSS APPLY (SELECT top 1 s.price
             FROM product_storage s
             WHERE s.idproduct=p.idproduct AND s.quantity > 0
             ORDER BY s.added ASC) AS Price(price1)

;

编辑:你的小提琴使用了错误的文字日期格式,试试这个:

INSERT INTO product_storage 
    (idstorage,idproduct, added, quantity,price)
VALUES
    (1, 1, '20100101',0,10.0),
    (2, 1, '20100102',0,11.0),
    (3, 1, '20100103',10,12.0),
    (4, 2, '20100104',0,12.0),
    (5, 2, '20100105',10,11.0),
    (6, 2, '20100106',10,13.0),
    (7, 3, '20100107',10,14.0),
    (8, 3, '20100108',10,16.0),
    (9, 3, '20100109',10,13.0)

【讨论】:

  • 这个查询也没有给出最后一行的正确结果,请与MYSQL比较sqlfiddle.com/#!9/a71b8/1
  • 正如 TFroes 指出的那样,原因是您对排序的想法。 SQL Server 不保留您可以依赖的隐式行顺序。如果有多行具有相同的值进行排序,它将完全随机首先出现...尝试使用唯一日期和/或包含时间的两个查询。
  • 好的,但是我更改了相同的值,然后它也显示相同的结果检查这个:-sqlfiddle.com/#!6/c896a/2
  • @GautamChawla,是的,这有点奇怪。原因是您插入日期的方式。只需在您的小提琴中尝试这一行 select * from product_storage order by added 并探索添加的列。对于文字日期用法,请阅读:stackoverflow.com/a/34275965/5089204
  • 嗨,谢谢,当我转换日期时间时它工作正常。感谢您的帮助:)
【解决方案3】:

这是 SQL Server 的正确架构,查询运行完美,如 Shnugo Replied。

 VALUES
        (1, 1, convert(datetime,'2010-01-01'),0,10.0),
        (2, 1, convert(datetime,'2010-01-02'),0,11.0),
        (3, 1, convert(datetime,'2010-01-03'),10,12.0),
        (4, 2, convert(datetime,'2010-01-04'),0,12.0),
        (5, 2, convert(datetime,'2010-01-05'),10,11.0),
        (6, 2, convert(datetime,'2010-01-06'),10,13.0),
        (7, 3, convert(datetime,'2010-01-07'),10,14.0),
        (8, 3, convert(datetime,'2010-01-07'),10,16.0),
        (9, 3, convert(datetime,'2010-01-09'),10,13.0)

【讨论】:

    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多