【问题标题】:Multiple filters on SQL querySQL查询的多个过滤器
【发布时间】:2013-01-01 14:02:25
【问题描述】:

我已经阅读了很多关于过滤 SQL 查询的主题,但似乎没有一个适用于我的案例,所以我需要一些帮助。我在 SQL 表上有以下数据。

Date                    item     quantity moved   quantity in stock sequence

13-03-2012 16:51:00    xpto         2                      2           1 
13-03-2012 16:51:00    xpto        -2                      0           2
21-03-2012 15:31:21    zyx          4                      6           1
21-03-2012 16:20:11    zyx          6                      12          2
22-03-2012 12:51:12    zyx         -3                      9           1

所以这是仓库中移动的数量,问题出在前两行同时是接收和返回,因为我正在尝试进行查询,以在给定时间为我提供库存的所有项目。我使用max(date),但我没有得到正确的结果数量。

【问题讨论】:

  • 你用的是什么关系型数据库?
  • 听起来你想让SUM("quantity moved") 得到你当时的总量?
  • 这是一个非常糟糕的设计。如果您可以更改架构,我建议您跟踪每个项目的移动,然后您可以查询移动了多少以及您有多少库存。
  • 嗯,它有点复杂,我不能使用 sum,因为程序有另一种控制数量信号的方法,它可以是正数,但仍然会减少数量。跨度>
  • SQL-Server,哪个版本? 2005、2008、2008R2、2012?

标签: sql sql-server filter max


【解决方案1】:
SELECT  item, qty_in_stock
FROM    (
        SELECT  *,
                ROW_NUMBER() OVER (PARTITION BY item ORDER BY item_date DESC, sequence DESC) rn
        FROM    mytable
        WHERE   item_date <= @date_of_stock
        ) q
WHERE   rn = 1

【讨论】:

  • WHERE item_date
  • @Dinarte:“进行查询,在给定时间为我提供所有商品的库存”。 @date_of_stock 是参数,“给定时间”。
  • +1 。 . .这是正确的答案。我回答时没有注意到库存字段中的数量。
  • 你是个天才,成功了!!!真的,非常感谢!!我现在必须研究这个查询,了解它是如何工作的,我不熟悉一些术语。
【解决方案2】:

如果您使用的是 SQL-Server 2012,这些是添加的几个不错的功能。

您可以将 LAST_VALUE - 或 FIRST_VALUE() - 函数与 ROWSRANGE 窗口框架结合使用(参见 OVER 子句):

SELECT DISTINCT
   item,
   LAST_VALUE(quantity_in_stock) OVER (PARTITION BY item 
                                       ORDER BY date, sequence
                                       ROWS BETWEEN UNBOUNDED PRECEDING 
                                                AND UNBOUNDED FOLLOWING) 
           AS quantity_in_stock
FROM  tableX
WHERE date <= @date_of_stock

【讨论】:

    【解决方案3】:

    添加where 子句并求和:

    select item, sum([quantity moved])
    from t
    group by item
    where t.date <= @DESIREDDATETIME
    

    如果您为所需的日期时间输入一个日期,请记住,当一天开始时,该日期是午夜。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-21
      • 2010-11-13
      • 1970-01-01
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多