Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 构建一个按月划分支出的查询。(将一行转换为多行)_Mysql_Sql_Sql Server - Fatal编程技术网

Mysql 构建一个按月划分支出的查询。(将一行转换为多行)

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

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

比如说,一次安置(记录)开始于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 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=月开始 )每月一次 这在sql server中应该可以工作,您可能需要对DATEDIFF计算、联接形式和替换数据库的强制转换进行微小的更改

编辑
您可以在外部查询中公开更多数据,以便验证每个时段的天数是否正确。您还可以将文本描述添加到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