【问题标题】:Find high and low prices in sql在sql中查找高低价格
【发布时间】:2010-06-23 22:27:49
【问题描述】:

在这个示例数据库中有两个表,产品和价格。 目标是找到每种产品的最高和最低价格。

每个产品的价格表可以有零、一或两行。

create table products(
    id int,
    name nvarchar(50)
)

create table prices(
    productId int,
    price int
)

insert into products (id, name) values (33,'bike')
insert into products (id, name) values (44,'car')
insert into products (id, name) values (55,'bus')

insert into prices (productId, price) values (33, 10)
insert into prices (productId, price) values (33, 40)
insert into prices (productId, price) values (44, 300)

sql 查询应该是这样的:

productId  highPrice  lowPrice
33         40         10
44         300        NULL
55         NULL       NULL

【问题讨论】:

    标签: tsql


    【解决方案1】:

    这适用于 MySQL,但它也可能适用于您。

    SELECT
    products.id as productId
    , MIN(price) as highPrice
    , MAX(price) as lowPrice
    FROM products
      LEFT JOIN prices ON products.id=prices.productId
    GROUP BY products.id
    

    【讨论】:

      【解决方案2】:
      SELECT productId,
              MAX(price) AS highPrice,
              MIN(price) AS lowPrice
      FROM prices
      GROUP BY productId
      

      如果您还想要产品名称:

      SELECT name,
              MAX(price) AS highPrice,
              MIN(price) AS lowPrice
      FROM products
          LEFT OUTER JOIN prices ON ID = ProductID
      GROUP BY name
      

      【讨论】:

      • 但这并没有给用户他说他追求的结果表。我们确定他写的东西有误吗?
      • 我怀疑 Simdendsjo 犯了一个错误。我只是展示了如何使用 MAX 和 MIN 内置函数来解决这个问题。如果您运行我的第二个查询并将“name”替换为“id”,您将从问题中得到完全相同的结果集。
      • 男孩,为什么我没有看到这个简单的解决方案。
      • 如果您查看所需结果集的第二行,它会将“highPrice”显示为 300,将“lowPrice”显示为 NULL。你的代码不会那样做。 Rasmus 是否真的想要结果集是一个单独的问题(他可能不想要)
      • @Yellowfog,我明白你现在在说什么了
      【解决方案3】:

      这会在 SQL Server 2005 中为您提供您正在寻找的表(我注意到其他答案没有)

      select P.ID as ProductID, 
      nullif(sum(case when idx=1 then price else 0 end), 0) as highPrice,
      nullif(sum(case when idx=2 then price else 0 end), 0) as lowPrice  from
      (
          select productid, price, row_number() over(partition by productID order by price desc) as idx from prices
      ) T
      right join products P on T.productID = P.ID
      group by P.ID
      

      【讨论】:

      • 谢谢,正是我要找的结果
      猜你喜欢
      • 2016-01-26
      • 2013-04-12
      • 2018-11-08
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      相关资源
      最近更新 更多