【问题标题】:How to select some rows as columns in mysql如何在mysql中选择一些行作为列
【发布时间】:2019-10-16 14:25:24
【问题描述】:

大家好?我正在使用存储员工工资、日期和电表读数的 MySQL 表。我想选择上个月的读数作为上个月的读数,当月的读数作为当月的读数,这就是我的意思

 payno | date       | value 
-------+------------+------------
 6     | 2019-08-31 | 2477
 6     | 2019-09-25 | 2487
 8     | 2019-08-31 | 1651.2
 8     | 2019-09-25 | 1697.6

上面是我表的结构,我想实现这样的:

 payno | previous month| current month
-------+---------------+------------
 6     | 2477          | 2487
 8     | 1651.2        | 1697.6

请注意,上个月的读数是月份(日期)为 8 的读数,而当前月份的读数是月份(日期)为 9 的读数。

【问题讨论】:

  • 你用的是哪个版本的mySQL?
  • @jimmy8ball 我使用的是 MySQL 5.6,在这种情况下 MYSQL 版本真的重要吗?
  • 如果您使用的是后一个版本,即 8+,您可以考虑使用窗口函数
  • “我使用的是 MySQL 5.6,在这种情况下 MYSQL 版本真的很重要吗?” 是的 MySQL 版本真的很重要,或者你可以使用 LEAD/LAG (MySQL 8+)或者您使用 MySQL 的用户变量 (MySQL 5.1+) 进行模拟,或者使用相关的子查询或滥用 MySQL 的 GROUP_CONCAT ..
  • ...也不清楚payno 组是否可以有两个以上的记录..

标签: mysql


【解决方案1】:

我不知道每个月能读多少,所以我们总结一下。

select e.payno,
(   select sum(x1.val) 
    from emp x1 
    where x1.payno=e.payno and month(x1.data)=month(date_sub(e.data, INTERVAL 1 MONTH))
    group by x1.payno ) AS prev_month,
(   select sum(x2.val) 
    from emp x2 
    where x2.payno=e.payno and month(x2.data)=month(e.data)
    group by x2.payno ) AS this_month
from emp e
where month(e.data)=9 /* this is where you specify "current" month */
;

【讨论】:

  • 我得看看你的答案。我已经实施了。当上个月和当前月份的记录都可用时,它工作正常。当没有当前月份读数时,我没有得到任何结果。是否可以修改您的查询,如果当月没有记录,它会给我上个月的读数,而当月的读数为空或 0?
  • @BensonKiprono 你刚刚问了另一个问题。如果您认为我的代码回答了您的原始问题,请接受答案,获取我的代码并提出关于 SO 的新问题,然后有人会尝试回答您。
猜你喜欢
  • 2015-12-13
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 2012-06-11
  • 2023-01-18
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
相关资源
最近更新 更多