【问题标题】:MYSQL GROUP BY pair of values with specific columnMYSQL GROUP BY 具有特定列的值对
【发布时间】: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

【问题讨论】:

    标签: mysql sql string sum aggregate-functions


    【解决方案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
    

    【讨论】:

    • 谢谢,这很快:)
    猜你喜欢
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多