Mysql 构建一个按月划分支出的查询。(将一行转换为多行)
因此,目前每个记录都有一个开始日期、结束日期和支出指标 比如说,一次安置(记录)开始于2016年1月1日,结束于2016年3月31日,总花费为1000美元。理想情况下,我希望查询将该记录分为4条记录:Mysql 构建一个按月划分支出的查询。(将一行转换为多行),mysql,sql,sql-server,Mysql,Sql,Sql Server,因此,目前每个记录都有一个开始日期、结束日期和支出指标 比如说,一次安置(记录)开始于2016年1月1日,结束于2016年3月31日,总花费为1000美元。理想情况下,我希望查询将该记录分为4条记录: 1月:344.44美元 2月:311.11美元 3月:344.44美元 在excel中,我通常使用与所附链接中类似的公式: 我目前的查询如下: select placement_id, placement_start_date, placement_end_date, ordered_net
- 1月:344.44美元
- 2月:311.11美元
- 3月:344.44美元
select placement_id, placement_start_date, placement_end_date,
ordered_net from agency_views_mbox.digital_placement
注意:我正在使用Aginity工作台进行红移,我发现一些随机SQL函数在Aginity中不兼容
任何帮助都将不胜感激 我将创建一个表示月份的表或视图,并根据开始日期和结束日期与支出表联接。这将为记录跨越的每个月提供一行 有很多方法可以做到这一点,在这个例子中, 我将要求您创建一个包含整数0,1,2,3,4,5,6,。。。在单个n列中,您可以调整月份数和开始日期以适合您的数据 注意,我使用了nextMonthStart,因为从每个月减去一天比较容易,因为我可以使用<而不是monthStart,然后使用placement\u start\u date,否则monthStart end作为PeriodStart ,当placement_end_date
您可以在外部查询中公开更多数据,以便验证每个时段的天数是否正确。您还可以将文本描述添加到MonthList视图中,以便查看行也适用于哪个月。别忘了求和这些值,以检查“按比例”是否正确分割了这些值。这是mysql还是sql server?帕特,你是如何按月分割结果的?迈克-谢谢你的回复。。。我出去度假了…现在才开始。希望我能完成这一切。我会让你留在UTD。谢谢
CREATE VIEW MonthList
as
SELECT TOP (240)
DATEADD(month, n, '2000-01-01') as MonthStart
, DATEADD(month, n + 1, '2000-01-01') as NextMonthStart
FROM tally
select
placement_id
, placement_start_date
, placement_end_date
, DailySpend * DATEDIFF(day, PeriodStart, PeriodEnd) as PeriodSpend
FROM (
SELECT placement_id
, placement_start_date
, placement_end_date
, CAST(ordered_net as decimal(12,5))
/ CAST( DATEDIFF(day, placement_start_date, placement_end_date) as decimal(12.5)) as DailySpend
, CASE WHEN placement_start_date > monthStart THEN placement_start_date else monthStart end as PeriodStart
, CASE WHEN placement_end_date < nextmonthStart THEN placement_end_date else DATEADD(day, -1, nextmonthStart) end as PeriodEnd
from placement inner join
monthList on placement_start_date < nextMonthStart
and placement_end_date >= monthStart
) as monthlyCalcs