【问题标题】:mySQL ORDER BY SUM of double GROUP BY, preserve groupsmySQL ORDER BY SUM of double GROUP BY,保留组
【发布时间】:2016-06-22 15:19:51
【问题描述】:

这里的问题是:我有一个看起来像这样的表(简化)

+------+------+------+
| res  | loc  | rent |
+------+------+------+
| WEB  | WP   |  100 |
| WEB  | VA   |  300 |
| VR   | WP   |  500 |
| VR   | VA   |  200 |
| VR   | VA   |  600 | 
| CS   | WP   |  400 | 
| CS   | WP   |   90 |
+------+------+------+

我可以使用 SELECT res, loc, SUM(rent) FROM testTable GROUP BY res, loc 使表格看起来像这样;

+------+------+-----------+
| res  | loc  | SUM(rent) |
+------+------+-----------+
| CS   | WP   |       490 |
| VR   | VA   |       800 |
| VR   | WP   |       500 |
| WEB  | VA   |       300 |
| WEB  | WP   |       100 |
+------+------+-----------+

我想从这里首先订购带有 VR 的桌子(因为它的 TOTAL 租金最大),然后是 CS ,然后是 WEB 但我也想保留组顺序,所以它看起来像这样

+------+------+-----------+
| res  | loc  | SUM(rent) |
+------+------+-----------+
| VR   | VA   |       800 |
| VR   | WP   |       500 |
| CS   | WP   |       490 |
| WEB  | VA   |       300 |
| WEB  | WP   |       100 |
+------+------+-----------+

这样,它们将按位置分组的租金相加,然后按最大租金总额排序,然后按该租金总额中的租金排序。 VR 是首要原因 (800 + 500) > 490 > (300 + 100),并且 loc VA 在 VR 组中排在 WP 之前,因为 800 > 500。

这可能是我的梦想太大了吗?

【问题讨论】:

    标签: mysql group-by sql-order-by


    【解决方案1】:

    您需要在子查询中分别计算 res 值的总和,如下所示:

    SELECT t.res, t.loc, SUM(t.rent) AS reslocRent
    FROM table AS t
    INNER JOIN (
       SELECT res, SUM(rent) AS resRent
       FROM table
       GROUP BY res
    ) AS subQ ON t.res = subQ.res
    GROUP BY t.res, t.loc
    ORDER BY subQ.resRent DESC, reslocRent DESC
    

    【讨论】:

    • 太棒了,正是我想要的,谢谢。但是,我的问题有一个扩展部分:我是否有可能做类似 LIMIT 2 的事情并让它返回一个只有前两个 res(VR 和 CS)的表格?
    • 只将 LIMIT 2 添加到子查询应该将其限制为前两个 res(由于 inner 连接),但仍显示它们的所有 loc 总和;如果您只想要列表 res 的最高位置,请将限制 2 放在整个查询的最后。
    • 上面的评论应该说如果你只想要highest res的最高位置
    【解决方案2】:

    您似乎只需要按降序排列ORDER BY rent 的总和:

    SELECT res, loc, SUM(rent) 
    FROM testTable 
    GROUP BY res, loc
    ORDER BY SUM(rent) DESC
    

    【讨论】:

      猜你喜欢
      • 2013-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-02
      • 1970-01-01
      • 2012-05-06
      • 2021-02-22
      相关资源
      最近更新 更多