我试图自动化一些销售处理,目前大部分是手动的。我得到的销售按月表示为201701,201702等。
我想要完成的部分工作是更好地对历史数据重用聚合查询,目前云中只保存了很多查询。我需要能够通过一年和季度,并得到一个模式,以匹配销售数据。我希望使用datetime函数中构建的SQL来实现这一点,而不是使用case语句和强制转换。
有什么更好的方法来完成以下操作,即不依赖于字符串操作?
-- the @year and @quarter will be passed into a SP
declare @year int = 2017
declare @quarter int = 2
declare @name_timePeriod nvarchar(20) = 'Qtr'+ ' ' + cast(@quarter as nvarchar(2)) + ' ' + cast(@year as nvarchar(4))
declare @contained_periods nvarchar(max) =
case @quarter
when 1 then cast(@year as nvarchar(4)) + '0[1-3]'
when 2 then cast(@year as nvarchar(4)) + '0[4-6]'
when 3 then cast(@year as nvarchar(4)) + '0[7-9]'
when 4 then cast(@year as nvarchar(4)) + '1[0-2]'
end发布于 2017-09-22 15:11:06
我注意到您已经决定了解决方案,但希望提供另一个使用亚伦·伯特兰的日期维数表的建议。
在很多情况下,日期维表会派上用场。
假设您已经创建并加载了他的Date维度表,它将非常简单,如下所示:
DECLARE @year INT = 2017
,@quarter INT = 3
SELECT DISTINCT convert(VARCHAR(4), [Year]) + right(REPLICATE('0', 2) + convert(VARCHAR(2), [Month]), 2) as Period
FROM DateDimension
WHERE [Year] = @year
AND [Quarter] = @quarter
--OR
SELECT DISTINCT substring(MMYYYY,3,4) + substring(MMYYYY,1,2) as Period
FROM DateDimension
WHERE [Year] = @year
AND [Quarter] = @quarter给予
| Period |
|--------|
| 201707 |
| 201708 |
| 201709 |发布于 2017-09-22 13:14:50
Nate...you需要构建一个sproc,它需要一个日期范围,例如:@startdate和@enddate,两者都是datetime。
将行规范化为date或datetime数据类型,即使您必须假设day部件是01。
一旦规范化了日期时间值(S),就可以使用where datetime_field between @startdate and @enddate
我建议不要尝试在sql中评估季度数据范围,这个过程更基于过程,并且对基于集合的操作不太友好。
https://dba.stackexchange.com/questions/186606
复制相似问题