如何在mysql中选择一些行作为列
大家好?我正在使用一个MySQL表,该表存储员工的工资、日期和电表读数。我想选择上个月的读数作为上个月的读数,选择本月的读数作为本月的读数,这就是我的意思如何在mysql中选择一些行作为列,mysql,Mysql,大家好?我正在使用一个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
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的读数。我不知道每个月可以读取多少读数,因此我们将对它们进行总结
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 */
;
MySQL版本是什么?我使用MySQL 5.6,在这种情况下MySQL版本真的很重要吗?如果你在后一版本,即8 +“我使用MySQL 5.6,MySQL版本真的很重要吗?”,你可以考虑加窗函数。“是的,MySQL版本真的很重要,或者你可以使用引线/延迟(MySQL 8 +)。或者你用MySQL的用户变量(MySQL 5.1+)来模拟,或者使用相关子查询,或者滥用MySQL的GROUP_CONCAT。。。。。另外,还不清楚一个
payno
组是否可以有两条以上的记录..我得看看你的答案。我已经实施了它。当上个月和当前月记录都可用时,它可以正常工作。当没有当前月份的读数时,我不会得到任何结果。是否可以修改您的查询,以便在当前月份没有记录的情况下,它会给我上个月的读数,而当前月份的读数为null或0?@BensonKiprono您刚刚问了另一个问题。如果你认为我的代码回答了你原来的问题,那么接受答案,接受我的代码,然后问一个新的问题,然后有人会尝试回答你。