【问题标题】:ORDER BY results of a query (nested?)ORDER BY 查询结果(嵌套?)
【发布时间】:2015-03-17 07:42:08
【问题描述】:

注意:我浏览过类似的问题,但他们没有回答我的问题。

为了练习 SQL,我在 MS Access 中创建了一个测试数据库。它存储有关汽车商店业务的信息。布局是这样的:

我希望列出(按他们分组)具有给定品牌最常购买/订购的服务的汽车制造商。我不知道如何在这里使用ORDER BY 子句。 SO:每个品牌都应该只展示一次,以及最常购买的服务。

示例:
保时捷 |换油
福特 |换胎
雪佛兰 |更换刹车油
等等

我想我应该以某种方式嵌套它,但我不知道如何准确地做到这一点。

我能够构建以下查询,它将列出所有汽车服务关系:

SELECT cars.Make, services.[Service name]
FROM (repairs 
INNER JOIN cars ON cars.[Car number] = repairs.[Car number]) 
INNER JOIN services ON services.ID = repairs.[Service ID]
GROUP BY cars.Make, services.[Service name];

如上所述,我将如何正确构建此查询?

【问题讨论】:

  • 只需在 GROUP BY 子句之后添加所需的 ORDER BY 子句。请注意(通常 - 有例外)GROUP BY 中的字段顺序 重要,但在 ORDER BY 子句中 重要。
  • 好吧,正如问题中所述,我不知道我想要ORDER BY - 没有包含这些值的列。

标签: sql ms-access


【解决方案1】:

您能试试这个在子查询中使用 MAX 和 COUNT 的查询吗?

SELECT sub1.make, sub1.[Service name]
FROM (
    SELECT cars.Make, services.[Service name], COUNT(*) as COUNTREPAIR
    FROM (repairs 
    INNER JOIN cars ON cars.[Car number] = repairs.[Car number]) 
    INNER JOIN services ON services.ID = repairs.[Service ID]
    GROUP BY cars.Make, services.[Service name]
) sub1
INNER JOIN
    (SELECT sub2.make, MAX(COUNTREPAIR) as MAXCOUNT
    FROM 
        (
        SELECT cars.Make, services.[Service name], COUNT(*) as COUNTREPAIR
        FROM (repairs 
        INNER JOIN cars ON cars.[Car number] = repairs.[Car number]) 
        INNER JOIN services ON services.ID = repairs.[Service ID]
        GROUP BY cars.Make, services.[Service name]
        ) sub2
    GROUP BY sub2.Make
    ) sub3
ON sub1.COUNTREPAIR = sub3.MAXCOUNT
AND sub1.MAKE = sub3.MAKE;

我将一个 Access 数据库和一些模仿您的虚拟数据放在一起,因此希望它能为您提供所需的结果。

如果您想要这些服务的 COUNT,您可以在第一行的末尾添加“sub1.COUNTREPAIR”。

【讨论】:

  • 好吧,它抱怨外部 SELECT 中的 Make 列不是聚合函数的一部分......这是有道理的,它不是。
  • 当然 - 忘了添加那个。我更新了查询 - 只需要在最后添加一个 GROUP BY。现在可以了吗?
  • 不,保时捷仍然列了两次:i.gyazo.com/0b2e24e5ea998f9092aa14307d7724e9.png
  • 嗯,我明白你的意思了。我重新阅读了你的问题,看看你在追求什么。现在上面的查询怎么样?我从外部查询中删除了服务名称,它应该只显示 Make 以及每个 Make 的记录数。
  • 嗯,是的,它确实如您所描述的那样工作,但这不是我所追求的。我想列出服务,而不是记录计数(请参阅问题以获取示例)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多