【发布时间】:2018-11-13 06:54:02
【问题描述】:
我遇到了一项任务,我必须返回当月每一天发布的保单的总数和总和,并将其与上一年进行比较。
表 PolicyOrder 有字段:
PolicyOrderId - 主键 创建时间(日期时间) CalculatedPremium - 保单成本或“保费” PolicyOrderStatusId - 与问题无关,但仍然 - 政策的状态。
为了解决这个问题,我提出了一个查询,该查询通过根据创建日期的 DAY 分组来内部连接自我表和求和/计数。
SELECT
DATE(po1.CreatedAt) AS dayDate_2017,
SUM(po1.CalculatedPremium) AS premiumSum_2017,
COUNT(po1.PolicyOrderId) AS policyCount_2017,
po2.*
FROM
PolicyOrder po1
INNER JOIN (
SELECT
DATE(CreatedAt) AS dayDate_2018,
SUM(CalculatedPremium) AS premiumSum_2018,
COUNT(PolicyOrderId) AS policyCount_2018
FROM
PolicyOrder po2
WHERE
YEAR(CreatedAt) = 2018 AND
MONTH(CreatedAt) = 10 AND
PolicyOrderStatusId = 6
GROUP BY
DAY(CreatedAt)
) po2 ON (
DAY(po2.dayDate_2018) = DAY(po1.CreatedAt)
)
WHERE
YEAR(po1.CreatedAt) = 2017 AND
MONTH(po1.CreatedAt) = 10 AND
PolicyOrderStatusId = 6
GROUP BY
DAY(po1.CreatedAt)
以上查询返回以下结果:
dayDate_2017 | premiumSum_2017 | policyCount_2017 | dayDate_2018 | premiumSum_2018 | policyCount_2018
2017-10-01 | 4699.36 | 98 | 2018-10-01 | 8524.21 | 144
2017-10-02 | 9114.55 | 168 | 2018-10-02 | 7942.25 | 140
2017-10-03 | 9512.43 | 178 | 2018-10-03 | 9399.61 | 161
2017-10-04 | 9291.77 | 155 | 2018-10-04 | 6922.83 | 137
2017-10-05 | 8063.27 | 155 | 2018-10-05 | 9278.58 | 178
2017-10-06 | 9743.40 | 184 | 2018-10-06 | 6139.38 | 136
...
2017-10-31 | ...
问题是,现在我必须再添加两列,其中必须计算政策和从年初开始添加的金额,直到每个返回的行。
Desired results:
dayDate_2017 | premiumSum_2017 | policyCount_2017 | sumFromYearBegining | countFromYearBegining
2017-10-01 | 4699.36 | 98 | 150000.34 | 5332
2017-10-02 | 9114.55 | 168 | 156230.55 | 5443
2017-10-03 | 9512.43 | 178 | 160232.44 | 5663
...
2017-10-31 | ...
WHERE:
sumFromYearBegining (150000.34) - SUM of premiumSum from 2017-01-01 until 2017-10-01 (excluding)
countFromYearBegining (5332) - COUNT of policies from 2017-01-01 until 2017-10-01 (excluding)
sumFromYearBegining (1566239.55) - SUM of premiumSum from 2017-01-01 until 2017-10-02 (excluding)
countFromYearBegining (5443) - COUNT of policies from 2017-01-01 until 2017-10-02 (excluding)
sumFromYearBegining (160232.44) - SUM of premiumSum from 2017-01-01 until 2017-10-02 (excluding)
countFromYearBegining (5663) - COUNT of policies from 2017-01-01 until 2017-10-02 (excluding)
我尝试过内部加入同一个表 COUNTed 和 SUMed,但失败了,因为我无法指定我需要计数和求和的范围,我尝试了 LEFT 加入然后计数,但失败了,因为直到每个结果都被计算在内行结果,但直到最后一个结果等......
DB 小提琴:https://www.db-fiddle.com/f/ckM8HyTD6NjLbK41Mq1gct/5
非常感谢您的 SQL 忍者提供的任何帮助。
【问题讨论】:
-
你能设置一个db-fiddle.com
-
小提琴已添加到问题中。 db-fiddle.com/f/ckM8HyTD6NjLbK41Mq1gct/4
-
你的 MySQL 服务器版本是多少?而且,您可以访问/升级到最新版本(8.0.2 及更高版本)吗?
-
生产服务器上的 MySQL 版本为 5.5。我可以升级开发环境,但生产服务器将保持 5.5。
-
我不清楚期望的结果示例。例如。为什么在 2017-10-02 有 168 个(不是 111 个)新政策时,
countFromYearBegining从 5332 增加到 5443(相差 111)?