【问题标题】:How can I use a subquery on my query results and then ORDER BY a calculated result for each row?如何在查询结果上使用子查询,然后按每行的计算结果排序?
【发布时间】:2014-08-16 02:04:03
【问题描述】:

上下文

我在将子查询的逻辑(?)放在一起时遇到了一些麻烦。

   *---------*---------*---------*------------*------------*---------*
   |GUEST_ID | Country | County  | Attending  | Donation   | Party   |
   *---------*---------*---------*------------*------------*---------*

我有一个数据库,其中包含有关慈善舞会参加者的记录。

GUEST_ID:表键。
国家:客人来自的国家。
:客人来自的县(即该国家/地区的某个地区)。
出席:客人是否出席(即真或假)。
捐款:客人为这项事业捐款的金额。
派对:客人参加的派对。


目标

我希望显示一个按国家和县划分的表格,显示来自每个国家 + 县的参加者人数,以及来自该国家 + 国家的参加者的平均捐款。然后我想从最高平均捐赠到最低排序。我了解此查询的组成部分,但是我不确定如何将其作为一个整体“粘合”在一起。

我可以GROUP BY Country, County

我可以SUM(Donation)

我可以COUNT(*) WHERE ATTENDING = 'Yes'

而且我知道我可以SET @variables 临时存储结果。

我也知道我可以ORDER BY DESC

到目前为止

我的问题是如何理解如何将这些元素组合成一个有效的查询。我猜我需要使用子查询,但是它得到了正确的顺序,我遇到了麻烦。这就是我目前所拥有的 -

SELECT SUM(`Donation`) AS `TotalDonations`, `Country`, `County`  
FROM `GuestList` 
WHERE `Party` = `2014CharityBall`
GROUP BY `Country`, `County`

我不知道如何添加子查询以找到只有那些肯定参加的客人的COUNT,或者如何计算 TotalDonations /definiteAttending 然后ORDER BY 这个。


需要结果

*------------*------------*---------------*---------------*---------------*
| Country    | County     | # of Attendees|Total Donations|Avg. Donation  |
*------------*------------*---------------*---------------*---------------*

国家/地区:客人来自的国家/地区。
:客人来自的县(即该国家/地区的某个地区)。
参加人数:该国家和县的参加人数(参加人数 = 'true')。
捐款总额:该国家和县(例如SUM(Donation))内所有参加(参加 = 'true')的人的捐款总额。
平均捐款:该国家和县内所有参加者的平均捐款(Attending = 'true')(例如 AVG(Donation) - 即 ofc,捐款总额 / 参加者人数)。


额外积分

只是一个表达式;)

如果我想计算受邀参加派对的所有捐赠者的总捐赠额,以及单独计算参加派对的捐赠者的捐赠总额,如何我这样做?

【问题讨论】:

  • 是的,抱歉。我还是很新。我将添加正确的标签。谢谢。
  • 只是戳一下,您是否还需要同一结果集中每个国家/地区的总总额?
  • @Serpiton 我已将所需的结果添加到我的问题中
  • 完美,但我之前提出的问题有所不同:您是否还需要每个国家/地区的总数,不考虑县?
  • 啊,是的,对不起,我的错误。不,我不需要每个国家/地区:)

标签: mysql sql


【解决方案1】:
    SELECT `Country`, 
    `County`,
    SUM(`Donation`) AS `TotalDonations`,
    FORMAT(AVG(`Donation`), 0) AS `AVGDonations`,
    COUNT(1) Attending
    FROM `GuestList` 
    WHERE `Party` = `2014CharityBall`
           AND Attending = `Yes`
    GROUP BY `Country`, `County`
    Order by 4 desc

【讨论】:

  • 谢谢,我会试试的。请问ORDER BY 4是什么? 4 指的是什么?
  • 这将返回每个人的SUMAVG,而不仅仅是参加者
  • @Eilidh,SELECT 语句中的第 4 列。
  • @Serpiton,GROUP BY 应该让它在组级别做聚合值。
  • 这会将AVGDonations 列显示为具有三位小数的浮点数。如何删除小数位?
猜你喜欢
  • 1970-01-01
  • 2020-09-19
  • 1970-01-01
  • 2015-11-06
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 2022-01-24
相关资源
最近更新 更多