【问题标题】:How to list the most expensive and the cheapest item in each category in Oracle SQL?Oracle SQL中如何列出每个类别中最贵和最便宜的项目?
【发布时间】:2019-11-18 17:19:58
【问题描述】:

所以我需要获取一个类别列表,然后从每个类别中获取最贵的商品和最便宜的商品。然后我需要按 ASC 顺序的最低和最高价格之和对这些类别进行排序。我试过这个:

SELECT k.name AS Category, p.name AS MostExpensive, p.name AS Cheapest, Max(price),Min(price)
FROM category k, item p
WHERE  p.category_id=k.category_id 
GROUP BY k.name,p.name
ORDER BY Min(price)+Max(price) ASC;

现在这部分工作。它确实给了我一个订购类别的列表,它给了我最便宜和最贵物品的价格。但问题是它不会连续完成。例如,我在前 2 行得到这个:

无论如何,我需要这张表看起来不同,我需要在其中有 CD 类别的一行,然后在 CD 旁边的一列中将 CD-RW 列为最昂贵的项目,然后紧挨着另一个以 CD-R 作为最便宜的项目的列。基本上,同样的东西,但只有 1 行。

如果有人能帮我解决这个问题,我真的很感激

【问题讨论】:

  • 如果您提供一个您正在查询的数据以及您希望输出的样子的示例,您获得好答案的机会会大得多。通常不鼓励使用屏幕截图。

标签: sql oracle


【解决方案1】:

尝试keep 子句如下:

SELECT k.name as cat_name,
       max(p.name) keep (dense_rank last order by price) as expensive_item,
       max(price) as max_price,
       max(p.name) keep (dense_rank first order by price) as cheapest_item, 
       min(price) as min_price
FROM category k join item p
On (p.category_id=k.category_id)
GROUP BY k.name
ORDER BY Min(price)+Max(price);

干杯!!

【讨论】:

  • 你能解释一下为什么我们在dense_rank之后首先使用和最后使用,我不明白
  • 第一个和最后一个决定使用密集排名将数字分配给行。所以对于最大值,我们想要最后一行和最小值,我们想要第一行。
【解决方案2】:

您应该按类别加入最低和最高价格组的 sunquery,其中表项目一为最高价格,一为最低价格

select  p1.name AS MostExpensive, p2.name, t1.max_price, t1.min_price
FROM  (
  SELECT k.name AS Category,  Max(price) max_price, Min(price) min_price
  FROM category k
  INNER JOIN item p ON  p.category_id=k.category_id 
  GROUP BY k.name
 ) t1 
 INNER JOIN Item  p1 ON p1.price = t1.max_price
 INNER JOIN Item  p2 ON p2.price = t1.min_price

并且您不应该使用基于WHERE 的(旧)隐式连接语法;您应该使用基于ON 子句的显式连接语法。

【讨论】:

    猜你喜欢
    • 2022-11-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2011-08-04
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多