我有以下SQL查询,它查找最古老的滑雪板的名称和年龄。
SELECT c.cname, MAX(c.age)
FROM Customers c
WHERE c.type = 'snowboard';
但我正在阅读的指南说查询是错误的,因为SELECT
子句中的非聚合列必须来自GROUP BY
子句中的属性。
我认为此查询符合其目的,因为聚合MAX(c.age)
对应于单个值。它确实找到了最古老的滑雪板的年龄。
答案 0 :(得分:0)
您需要按c.cname
列进行分组。每当您对某些列(如SUM,COUNT等)进行任何聚合时,您需要提供另一个要聚合的列。您通常会在SELECT
子句(此处为c.cname
)中提供这些列。 GROUP BY
子句中应该提到这些相同的列,否则会出现语法错误。
表格应为
SELECT A, B, C, SUM(D)
FROM TABLE_NAME
GROUP BY A, B, C;
您的查询应如下所示
SELECT c.cname, MAX(c.age)
FROM Customers c
WHERE c.type=‘snowboard’
GROUP BY c.cname;
答案 1 :(得分:0)
如果您想显示最古老的滑雪板的名称和年龄,您必须这样做:
SELECT c.cname, c.age
FROM Customers c
WHERE c.type = 'snowboard'
AND c.age = (SELECT MAX(age)
FROM Customers
WHERE type = 'snowboard')
答案 2 :(得分:0)
每当选择其他表属性和聚合函数时,它必须伴随group by子句,否则可能会出现数据库可能不知道必须选择哪一行的情况。让我们说在您的示例中有两个客户具有相同的最大年龄,现在数据库将尝试从两个行中提取年龄但是它会混淆,这个名称要选择。这里您的group by子句将进入图片,它将指示显示具有不同客户名称但具有相同最大年龄的两个不同行。 因此,您的查询应如下所示:
SELECT c.cname, MAX(c.age)
FROM Customers c
WHERE c.type=‘snowboard’
GROUP BY c.cname;