代码之家  ›  专栏  ›  技术社区  ›  learningbyexample

如何进行查询以选择和等于固定值的位置

  •  0
  • learningbyexample  · 技术社区  · 6 年前

    在过去的几天里,我一直在寻找一种生成SQL查询的方法,该查询搜索数据库并返回相同ID的和等于或大于所提供值的记录。

    为此,我一直在使用W3Schools数据库在 products table .

    更重要的是,我一直想做的是:

    SELECT * FROM products
    WHERE supplierid=? and SUM(price) > 50
    

    在“其中,供应商ID”将循环访问相同的供应商,并且在这种情况下,价格高于50的总和将返回记录。

    在这种情况下,它将读取供应商ID 1,然后添加所有供应商18+19+10=47的价格(现在为47<50),这样它就不会在末尾打印这些记录。下一个供应商ID 2 22+21.35=43.35,在价格总和高于50之前,不会再打印这些记录。

    我正在使用DB2数据库。 样本数据:

    ProductID   ProductName SupplierID  CategoryID  Price
    1           Chais       1           1           18
    2           Chang       1           1           19
    3           Aniseed     1           2           10
    4           Chef Anton  2           2           22
    5           Chef Anton  2           2           21.35
    6           Grandma's   3           2           25
    7           Uncle Bob   3           7           30
    8           Northwoods  3           2           40
    9           Mishi       4           6           97
    10          Ikura       4           8           31
    11          Queso       5           4           21
    12          Queso       5           4           38
    13          Konbu       6           8           6
    14          Tofu        6           7           23.25
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   The Impaler    6 年前

    怎么样:

    select * from products where supplierid in (
      select supplierid
        from products
        group by supplierid
        having sum(price) > 50
    );
    

    子查询查找所有 supplierid 符合条件的值。主(外部)查询检索与 供应商ID S.

        2
  •  2
  •   Martin Preiss    6 年前

    没有测试过,但我希望DB2具有分析函数和CTE,因此:

    with
    basedata as (
    select t.*
         , sum(t.price) over(partition by t.supplierid) sum_price
      from products t
    )
    select * 
      from basedata
     where supplierid = ?
       and sum_price > 50
    

    分析函数聚合价格信息,但不对结果集进行分组,因此可以从初始结果中获取行,但仅限于聚合价格值为50的行。

    与使用子查询的解决方案不同的是,使用分析函数应该更有效,因为它只需读取表一次即可生成结果。