交叉加入以获取特定年份特定月份的所有季度末月份

时间:2017-01-03 07:16:35

标签: sql teradata

我尝试编写逻辑以获得低于输出但没有成功。我脑海  现在空白。你能和我分享你的想法吗?我相信我们在一起  可以找出SQL中的一些最简单的解决方案来获得以下内容  输出。

添加更多,我不想要Q4键。  请注意,该表是Month维度,包含更多列,例如a  Prev01,02 ...月份键。

标记为SQL Server& Teradata以及我只关注逻辑和&不是语法。我正在使用Teradata。

现有数据:

enter image description here

预期输出:

enter image description here

因此,一年的总预期记录为12 * 3 = 36。

编辑:对于每一年,我们都有估计&预算值。对于前。

2016年,估计值将来自2016年3月至2016年(2016年6月)(2016年6月)(第3季度)。一个预算值将从2015年12月(第四季度)开始。 因此,2016年的任何一个月都将具有相同的预算估算值。这只会在年份发生变化时发生变化。我希望现在很清楚......

不幸的是,我无法共享表格DDL或样本数据。所以试图尽可能简单地解释这个场景。我能够编写SQL来获取预算值,但对于估算,情况有点棘手。因此,假设2016年4月,我想要的估计值是2016年3月,2016年6月,2016年9月。 现有数据是类似于样本数据的屏幕截图。

添加更多月份密钥就像一个标识列。 2017年1月的月份密钥为13&等......

2 个答案:

答案 0 :(得分:1)

在MSSQL中,我们可以这样做:

declare @temp table (month_key int,Months varchar(100),Years int,Quarter_Start int)
insert into @temp values (1 ,'Jan',2016, 1  )
insert into @temp values (2 ,'Feb',2016, 1  )
insert into @temp values (3 ,'Mar',2016, 1  )
insert into @temp values (4 ,'Apr',2016, 2  )
insert into @temp values (5 ,'May',2016, 2  )
insert into @temp values (6 ,'Jun',2016, 2  )
insert into @temp values (7 ,'Jul',2016, 3  )
insert into @temp values (8 ,'Aug',2016,  3 )
insert into @temp values (9 ,'Sep',2016,  3 )
insert into @temp values (10,'Oct',2016,  4 )
insert into @temp values (11,'Nov',2016,   4)
insert into @temp values (12,'Dec',2016,   4)

select 1 as 'Month_Key','Jan' as 'Month',Years,Months+'-16' as 'Scenario',month_key as 'Quarter End' from @temp where month_key in
(select max(month_key) from @temp group by Quarter_Start)

答案 1 :(得分:1)

这里是

select t1.month_key, t1.Month, Year, t3.Month+'-'+right(CAST(Year as varchar(4)),2) Scenario, t2.month_key Quarter_End
from YourData t1
cross join (
    select Quarter_Start, MAX(month_key) month_key
    from YourData
    group by Quarter_Start
) t2
join (
    select month_key, Month
    from YourData   
) t3 on t2.month_key = t3.month_key
where t2.month_key<>12 -- if you do not want last quarter
order by 1,5