【问题标题】:Building a Query that breaks out spend by month. (turning one row into multiple rows)构建一个按月细分支出的查询。 (将一排变成多排)
【发布时间】:2016-11-15 06:22:11
【问题描述】:

因此,目前每条记录都有一个开始日期、结束日期和一个支出指标。

假设一个展示位置(记录)开始于 2016 年 1 月 1 日,结束于 2016 年 3 月 31 日,总支出为 1,000 美元。理想情况下,我正在寻找将该记录分成 4 条记录的查询:

  • 1 月:344.44 美元
  • 2 月:311.11 美元
  • 3 月:344.44 美元

在 excel 中,我通常会使用类似于所附链接中的公式:http://www.excel-university.com/excel-formula-to-allocate-an-amount-into-monthly-columns/

我目前的查询如下:

select placement_id, placement_start_date, placement_end_date, 
ordered_net from agency_views_mbox.digital_placement

注意:我正在为 Redshift 使用 Aginity Workbench,我发现一些随机 SQL 函数在 Aginity 中不兼容。

任何帮助将不胜感激!

【问题讨论】:

  • 这是mysql还是sql-server?

标签: mysql sql sql-server


【解决方案1】:

我将创建一个代表月份的表或视图,并根据开始和结束日期加入支出表。这应该为记录跨越的每个月提供一行。

有很多方法可以做到这一点,在这个例子中, 我会要求你创建一个 tally 表(google it 或 StackOverflow),其中包含整数 0,1,2,3,4,5,6,... 在单个列 n 中,你可以调整月数和开始日期以适合您的数据。

注意我使用了 nextMonthStart,因为从每个月中减去一天更容易,因为我可以在以后的连接中使用

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

其次,计算该记录与该月重叠的天数 * 平均每日支出。

为了整洁,我假设您的桌子只是称为放置。 请注意,我必须在除法之前投射您的 ordered_net 和放置持续时间,您可能需要更改数据类型以适合您的数据库和数据。

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

这应该可以在 sql-server 中使用,您可能需要对 DATEDIFF 计算、JOIN 的形式和替代数据库的 CAST 进行微小的更改。

编辑 您可以在外部查询中公开更多数据,以便验证每个期间的天数是否正确。您还可以将文本描述添加到 MonthList 视图,以便您可以看到该行也适用于哪个月份。不要忘记对这些值求和以检查“pro rate”是否正确拆分了这些值。

【讨论】:

  • Pat,你是如何按月拆分结果的?
  • 迈克 - 感谢您的回复...正在度假...现在才开始。希望我能够完成所有这些工作。我会留给你UTD。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 2018-05-10
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多