我基本上面临与此主题中描述的问题相同的问题:http://www.experts-exchange.com/Database/Oracle/10.x/Q_24693813.html。不同之处在于我需要找到一个 MYSQL 的解决方案。
我正在处理电力使用表:
ID Account FromDate ToDate ElecUse ElecDemand ElecBillAmt
2903 100009 2010-10-14 2010-11-12 352400 668.1 12592.53
2904 100009 2010-11-12 2010-12-15 426400 666 14284.39
2905 100009 2010-12-15 2010-01-14 406800 708.4 13812.54
2906 100009 2010-01-14 2010-02-15 443200 697.9 14514.99
我想每月报告使用情况,从每月开始到每个月末结束。因此,我想有一个MYSQL查询,可以从上面生成下表:
Account FromDate ToDate ElecUse ElecDemand ElecBillAmt
100009 2010-10-14 2010-10-31 206579 391.51 7381.74
100009 2010-11-01 2010-11-30 378402 639.24 13002.12
100009 2010-12-01 2010-12-31 410778 680.46 13859.46
100009 2011-01-01 2011-01-31 425290 701.14 14156.77
100009 2011-02-01 2011-02-15 207750 327 6803.85
我很感激帮助, 丹
答案 0 :(得分:0)
将列转换为行通常是自联接或联合的工作。
在所有示例中,您的FromDate是ToDate之前的一个月。如何获取第一个月的天数,另一个获取第二个月的剩余天数?之后在两者之间分配ElecUse很容易。
根据您的实际数据,您可能需要更多查询(两个日期在同一个月等)。
select fromdate, last_day(fromdate) as todate,
datediff(last_day(fromdate), fromdate) as days_in_month,
datediff(todate, fromdate) as days_in_range,
datediff(last_day(fromdate), fromdate)/datediff(todate, fromdate) as pct_in_month,
elecuse * (datediff(last_day(fromdate), fromdate)/datediff(todate, fromdate)) as elecuse_in_month
...
我离开了中间栏,这样你就可以看到发生了什么:
+------------+------------+---------------+---------------+--------------+------------------+
| fromdate | todate | days_in_month | days_in_range | pct_in_month | elecuse_in_month |
+------------+------------+---------------+---------------+--------------+------------------+
| 2010-10-14 | 2010-10-31 | 17 | 29 | 0.5862 | 206579.3102 |
+------------+------------+---------------+---------------+--------------+------------------+
UNION那个在原始行的范围内执行第二个月的另一个查询,你应该全部设置。
注意@OllieJones关于ElecDemand的警告。