【发布时间】:2015-01-13 17:05:43
【问题描述】:
我有这个视图,它有一个特定的相对周编号列,称为 WeekNr。源表中的两列(WeekNr 和 CURWEEK)使用通常的日历周编号:1、2、3... 到 52。
此视图用于 Excel 文件,企业希望查看从 -12 到 +6 的相对周数:过去 12 周和 6 周的投影,相对于第 0 周,即当前周(今天,2015 年 1 月 13 日,这是日历周 2)。
所以,这段代码工作得很好,直到这一年过去了。 52 岁之后,WeekNr - CURWEEK 不再按预期工作。
您对此有什么优雅的解决方案吗?
CREATE VIEW [dbo].[vw_NOSSCE_HealthKPIs_DEV]
AS
(
SELECT
[Region]
,[Country]
,[GlobalMaterialCode]
,[Material]
,[MaterialCode]
,[PlantCode]
,[Plant]
,[Brand]
,
(WeekNr - (SELECT TOP 1 CURWEEK FROM [TO_BDB].[dbo].[TO_BDB_NOSSCE_FACT_NORMALIZED]) ) as
WeekNr
,[MEDICAL_NEED]
,[TOP_SELLER]
,[PHARMABU_CODE]
,[PharmaBU]
,[SourceLocationCode]
,[SourceLocation]
,[InventoryTotal]
,[MaxStockQtyTotal]
,[TotalSafetyStockTotal]
,[DangerTreshold]
,[FORECAST_FLG]
,[DangerZoneDesc]
FROM [TO_BDB].[dbo].[TO_BDB_NOSSCE_PAST12_HIST]
WHERE (WeekNr - (SELECT TOP 1 CURWEEK
FROM [TO_BDB].[dbo].[TO_BDB_NOSSCE_FACT_NORMALIZED]) )
BETWEEN -12 and 6
GROUP BY [Region]
,[Country]
,[GlobalMaterialCode]
,[Material]
,[MaterialCode]
,[PlantCode]
,[Plant]
,[Brand]
,WeekNr, [MEDICAL_NEED]
,[TOP_SELLER]
,[PHARMABU_CODE]
,[PharmaBU]
,[SourceLocationCode]
,[SourceLocation]
,[InventoryTotal]
,[MaxStockQtyTotal]
,[TotalSafetyStockTotal]
,[DangerTreshold]
,[FORECAST_FLG]
,[DangerZoneDesc]
UNION ALL
SELECT * FROM [dbo].[vw_NOSSCE_HealthKPIs] WHERE WeekNr > 0
)
更新,我创建了日历表,为什么它给了我第 53 周?
CREATE TABLE [dbo].[TO_BDB_NOSSCE_CALENDAR](
[ID] [int] IDENTITY(1,1) NOT NULL,
[DATE] [date] NOT NULL,
[YEAR] AS (datepart(year,[DATE])) PERSISTED,
[SEMESTER] AS (case when datepart(month,[DATE])<(7) then '1' else '2' end) PERSISTED NOT NULL,
[TRIMESTER] AS (case when datepart(month,[DATE])<(4) then '1' else case when datepart(month,[DATE])<(7) then '2' else case when datepart(month,[DATE])<(10) then '3' else '4' end end end) PERSISTED NOT NULL,
[MONTH] AS (case when len(CONVERT([varchar](2),datepart(month,[DATE]),0))=(1) then '0'+CONVERT([varchar](2),datepart(month,[DATE]),0) else CONVERT([varchar](2),datepart(month,[DATE]),0) end) PERSISTED,
[WEEK] AS (case when len(CONVERT([varchar](2),datepart(week,[DATE]),0))=(1) then '0'+CONVERT([varchar](2),datepart(week,[DATE]),0) else CONVERT([varchar](2),datepart(week,[DATE]),0) end),
[DAY] AS (case when len(CONVERT([varchar](2),datepart(day,[DATE]),0))=(1) then '0'+CONVERT([varchar](2),datepart(day,[DATE]),0) else CONVERT([varchar](2),datepart(day,[DATE]),0) end) PERSISTED,
[WEEKNUMBER] AS (datepart(week,[DATE])),
PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
【问题讨论】:
-
我想说的是 (WeekNr - CURWEEK + 52) % 52,这就是我用来计算接近 0 或 360 的角度差的方法,我认为这与您遇到的问题相同。
-
您能否向我们提供一些示例数据,说明它现在在本周的情况?在解决问题时查看它的外观会有所帮助。
标签: sql sql-server tsql