我有以下MySQL代码:
SELECT company, ((AVG (q1) + AVG(q2) + AVG(q3) ) / 3) AS High,
(SELECT company, ((AVG (q1) + AVG(q2) + AVG(q3) ) / 3)
FROM tresults_new GROUP BY company ASC LIMIT 1) AS Low
FROM tresults_new GROUP BY company DESC LIMIT 1
现在我理解为什么这会在标题中带回错误,因为我在子查询中带回了company
和Low
。
我正在努力的是how
在单个查询中同时返回High
和Low
(或者如果您更喜欢Max
和Min
)如果可能的话,我无法理解,以及如何实现它。
欢迎提出任何建议和反馈。
供参考,表格结构:
company q1 q2 q3
abc 5 6 2
abc 9 5 8
xyz 3 4 6
xyz 3 2 1
zyx 7 9 10
答案 0 :(得分:1)
使用max和min函数应该有所帮助。我倾向于在SQL Server中工作,但对MySQL也是如此。
进一步澄清后更新
所以对我的回复发表评论之后。 OP发布和另一个回复。我摆弄了一下,这实际上应该让你得到你想要的东西。如果您只是这样做一次可能会夸大它,但如果您的数据集变大,这应该可以满足您的需求,并且仍然可以为您提供所需的最大值和最小值,这样您就可以了解最高和最低性能的公司。如果你想自己玩它,我也做了一个SQLFiddle - 要清楚我使用的是SQL Server,因为我在小提琴例子中比较熟悉,但对MySQL的任何修改都应该相对简单。
SELECT vals.company, vals.myval
FROM
(SELECT company, ((AVG (q1) + AVG(q2) + AVG(q3) ) / 3) as myval
FROM tresults_new GROUP BY company
) vals
INNER JOIN
(
SELECT max(myval) val
FROM
(SELECT company, ((AVG (q1) + AVG(q2) + AVG(q3) ) / 3) as myval
FROM tresults_new GROUP BY company
) s
UNION
SELECT min(myval) val
FROM
(SELECT company, ((AVG (q1) + AVG(q2) + AVG(q3) ) / 3) as myval
FROM tresults_new GROUP BY company
) s
) maxmin on maxmin.val = vals.myval
答案 1 :(得分:1)
我不认为你可以合理地避免两个查询,或者它将是一个子查询,让你没有好转。根据您的评论和您的示例查询,我们了解到您只对哪个公司的AVG(q1)+AVG(q2)+AVG(q3)
值最高且哪个公司价值最低的公司感兴趣。在这种情况下,我只依赖于按此值排序的单个查询。第一行和最后一行将是您的答案。
SELECT company, val FROM
(SELECT company, AVG(q1) + AVG(q2) + AVG(q3) AS val
FROM tresults_new
GROUP BY company
ORDER BY val DESC LIMIT 1)
AS VAL_MAX
UNION
SELECT company, val FROM
(SELECT company, AVG(q1) + AVG(q2) + AVG(q3) AS val
FROM tresults_new
GROUP BY company
ORDER BY val ASC LIMIT 1)
AS VAL_MIN
或只有一个没有LIMIT
子句的查询,并获取第一行和最后一行。
警告:当然,写下这样的东西很有吸引力:
SELECT company, MIN(val), MAX(val) FROM
(SELECT company, AVG(q1) + AVG(q2) + AVG(q3) AS val
FROM tresults_new
GROUP BY company)
AS values [GROUP BY company]
没有最后GROUP BY company
,您将获得最大值但不是公司(此查询将被MySQL接受但被其他一些RDBMS拒绝,因为你需要明确的分组。)
所以添加GROUP BY
,您只需获得相同的最小值和最大值,这样您就不会比内部查询更好。