MYSQL GROUP BY 具有特定列的值对

Posted

技术标签:

【中文标题】MYSQL GROUP BY 具有特定列的值对【英文标题】:MYSQL GROUP BY pair of values with specific column 【发布时间】:2021-03-15 22:01:52 【问题描述】:

我在表格中有一个句点列,其值的格式为Year-SemiQuarter。示例 2016-BQ12016-BQ22016-BQ3.......2016-BQ8 ,其中 BQ1BQ2 将共同构成相应年份的 1stQuarter。其他人类似

现在,我想对结果进行分组

季度

我的桌子是这样的。已将期间分成两列。


+====================+=============+================+==================================+=====+======================================+
| totalNumberOfUnits | productType | productSubType | SUBSTRING_INDEX(rsh.period, '-', 1  )  | SUBSTRING_INDEX(rsh.period, '-', -1) |
+====================+=============+================+==================================+=====+======================================+
|               1084 | Apartment   | High Rise      |                             2018       | BQ1                                  |
+--------------------+-------------+----------------+----------------------------------+-----+--------------------------------------+
|               1284 | Apartment   | High Rise      |                             2018       | BQ2                                      |
+--------------------+-------------+----------------+----------------------------------+-----+--------------------------------------+
|               1883 | Apartment   | High Rise      |                             2018       | BQ3                                       |
+--------------------+-------------+----------------+----------------------------------+-----+--------------------------------------+
|                183 | Apartment   | High Rise      |                             2018       | BQ4                                      |
+--------------------+-------------+----------------+----------------------------------+-----+--------------------------------------+
|                898 | Apartment   | High Rise      |                             2018       | BQ5                                       |
+--------------------+-------------+----------------+----------------------------------+-----+--------------------------------------+
|               2377 | Apartment   | High Rise      |                             2018       | BQ7                                       |
+--------------------+-------------+----------------+----------------------------------+-----+--------------------------------------+
|               2953 | Apartment   | High Rise      |                             2018       | BQ8                                       |
+--------------------+-------------+----------------+----------------------------------+-----+--------------------------------------+

输出应该是:

+====================+==+
| totalNumberOfUnits |  |
+====================+==+
|               2368 |  |
+--------------------+--+
|               2066 |  |
+--------------------+--+
|                898 |  |
+--------------------+--+
|               5330 |  |
+--------------------+--+

所以 2018 年第一季度的 totalNumberOfUnits2368,它是 BQ1 和 BQ2 的总和。对其他人也是如此。 BQ6 没有数据,所以totalNumberOfUnits 将是898,这是semi-quarter 的总单位数BQ5

这可能很简单,但我不知道该怎么做。在 Stack Overflow 中找不到相同的用例。感谢您的帮助!

我使用的 mysql 版本是 5.7.26

【问题讨论】:

【参考方案1】:

你可以使用字符串函数和聚合:

select 
    left(period, 4) as yyyy, 
    floor((right(rsh.period, 1) + 1) / 2) as q,
    sum(totalNumberOfUnits) as totalNumberOfUnits
from mytable
group by yyyy, q

【讨论】:

你可以只使用 ceil 而不是 floor 和 +1 我认为? @ysth:确实是的。我只是更习惯floor() 顺便说一句,ceil 不会为 BQ8 提供正确的值。它会给 5,但预期是 4,所以地板应该没问题。谢谢!! 是的,将地板改为天花板时,您还必须删除+ 1 对,抱歉,我错过了您之前评论中的 +1。感谢您的澄清!【参考方案2】:
GROUP BY SUBSTRING_INDEX(rsh.period, '-', 1 ), (SUBSTRING_INDEX(rsh.period, 'Q', -1) + 1) DIV 2

【讨论】:

谢谢,这很快:)

以上是关于MYSQL GROUP BY 具有特定列的值对的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 在两个group_by之后尝试两列的sum()

MySQL GROUP BY ...具有不同的值相同的字段

选择所有具有 GROUP BY 一列的列[重复]

从 GROUP BY 中获取具有 NULL 列的行

MySQL之分组查询(GROUP BY)

Linq Group by 并获取返回所有列的特定字符串规则的所有值