【问题标题】:MySQL get day/month table/matrix? [duplicate]MySQL获取日/月表/矩阵? [复制]
【发布时间】:2017-05-25 20:19:12
【问题描述】:

使用简单的日期和值表:

+------------+-------+
| date       | count |
+------------+-------+
| 2015-01-01 | 5     |
| 2015-01-02 | 2     |
| 2015-07-02 | 20    |

如何通过可能使用子选择和连接的单个 MySQL 查询获得所有月份作为列、天作为行的矩阵以及值?

+-----+----------+----------+---------
| Day | January  | February | March...
+-----+----------+----------+---------
| 1   | 5        | 8        | 12
| 2   | 2        | 9        | 5
| 3   | 5        | 12       | 6

这是否可能,无需使用 PHP 或任何其他脚本工具?

这将用于可视化几个月的趋势和峰值。

【问题讨论】:

  • 那一年呢?
  • @Shadow 这不是重复的。这个问题我们很清楚一年中有多少个月,早在编写查询之前。
  • @lc。重复问题的答案展示了静态和动态旋转。下次请先阅读重复的问题。
  • @Shadow 这个问题没有重复这个问题,特别是在措辞中“问题是我不知道我将拥有多少产品,因此列号需要根据行中的行动态更改产品表”。然而,答案确实也回答了这个问题,但这恰好是获得更大答案的第一步,您必须知道只提取特定的部分。
  • @lc。答案具体告诉您解决方案中哪个是静态部分,哪个是动态部分。但是,如果您坚持,这里还有一个:stackoverflow.com/questions/7674786/mysql-pivot-table 这里的问题并没有说列数是未知的。每天都会询问 mysql 中的数据透视表问题。我们真的不应该一遍又一遍地回答完全相同的问题。

标签: mysql pivot-table


【解决方案1】:

您本质上拥有的是一个枢轴,您可以通过条件总和(即其中包含 CASE 的 SUM)来完成此操作,按天数分组以获取各个行:

select DAY(date) as Day,
       sum(case when MONTH(date) = 1 then count else 0 end) as January,
       sum(case when MONTH(date) = 2 then count else 0 end) as February,
       --...
       sum(case when MONTH(date) = 12 then count else 0 end) as December
from myTable
group by DAY(date)

【讨论】:

  • 这里...有一个赞成票,但请注意您的解决方案将汇总所有年份(因为使用SUM)。
  • @TimBiegeleisen 你也一样,当然你的回答是假设每天应该只有一行。所以我们可能同时是对的,也是错的。
  • 好吧,我假设count 已经是特定日期(和年份)的一些聚合。但我可能是错的。
  • @TimBiegeleisen 这可能是一个合理的假设,我们所拥有的少量样本结果数据可以支持您的理论。
  • 这当然是一个非常简化的数据集,但在这种情况下,计数可能是基于日期的在线商店的销售数量。我对年份不感兴趣,因为我想获得平均流行的日子和月份的平均值,我还可以添加一个 WHERE 来过滤特定年份。
【解决方案2】:

如果你只想要一个 2015 年的矩阵,你可以做一个数据透视查询:

SELECT DATE_FORMAT(date, '%d') AS Day,
       MAX(CASE WHEN DATE_FORMAT(date, '%m') = 1  THEN count END) AS January,
       MAX(CASE WHEN DATE_FORMAT(date, '%m') = 2  THEN count END) AS February,
       MAX(CASE WHEN DATE_FORMAT(date, '%m') = 3  THEN count END) AS March,
       MAX(CASE WHEN DATE_FORMAT(date, '%m') = 4  THEN count END) AS April,
       MAX(CASE WHEN DATE_FORMAT(date, '%m') = 5  THEN count END) AS May,
       MAX(CASE WHEN DATE_FORMAT(date, '%m') = 6  THEN count END) AS June,
       MAX(CASE WHEN DATE_FORMAT(date, '%m') = 7  THEN count END) AS July,
       MAX(CASE WHEN DATE_FORMAT(date, '%m') = 8  THEN count END) AS August,
       MAX(CASE WHEN DATE_FORMAT(date, '%m') = 9  THEN count END) AS September,
       MAX(CASE WHEN DATE_FORMAT(date, '%m') = 10 THEN count END) AS October,
       MAX(CASE WHEN DATE_FORMAT(date, '%m') = 11 THEN count END) AS November,
       MAX(CASE WHEN DATE_FORMAT(date, '%m') = 12 THEN count END) AS December
FROM yourTable
WHERE DATE_FORMAT(date, '%Y') = '2015'
GROUP BY DATE_FORMAT(col, '%d')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 2013-04-12
    相关资源
    最近更新 更多