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-BQ1、2016-BQ2、2016-BQ3.......2016-BQ8 ,其中 BQ1 和 BQ2 将共同构成相应年份的 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 年第一季度的 totalNumberOfUnits
是 2368,它是 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 具有特定列的值对的主要内容,如果未能解决你的问题,请参考以下文章