Sql server 如何使用SQL Server使用ETL存储过程提取数据
在我的旧数据库中,有一个表Sql server 如何使用SQL Server使用ETL存储过程提取数据,sql-server,stored-procedures,etl,data-warehouse,snowflake-cloud-data-platform,Sql Server,Stored Procedures,Etl,Data Warehouse,Snowflake Cloud Data Platform,在我的旧数据库中,有一个表Album,其中存储了有关ID、AlbumName、发行日期(例如2017年1月1日)等信息 我想进一步将Release\u Date分解为一个时间维度表,因此我创建了一个DimDateAlbum表 这是我创建的时间维度表 CREATE TABLE [DimDateAlbum] ( [DateKey] INT PRIMARY KEY, [Date] DATETIME NOT NULL, [Year] INT NOT NULL, [Qu
Album
,其中存储了有关ID、AlbumName、发行日期(例如2017年1月1日)等信息
我想进一步将Release\u Date
分解为一个时间维度表,因此我创建了一个DimDateAlbum
表
这是我创建的时间维度表
CREATE TABLE [DimDateAlbum]
(
[DateKey] INT PRIMARY KEY,
[Date] DATETIME NOT NULL,
[Year] INT NOT NULL,
[Quarter] TINYINT NOT NULL,
[QuarterName] VARCHAR(6) NOT NULL, -- January to March: First, April to
June: Second etc
[Month] TINYINT NOT NULL,
[MonthName] VARCHAR(9) NOT NULL, -- January, February etc
[Day] TINYINT NOT NULL, -- Field holds day number of Month
[DayofWeek] TINYINT NOT NULL,
[WeekName] VARCHAR(9) NOT NULL, -- Field displays 1: Monday, 2: Tuesday etc
)
如下所述:我可以在时间维度表中插入Release\u Date
,作为[DateKey]
,但是,如何进一步将日期分解为年、季度、日等
INSERT INTO DimDateAlbum
SELECT
a.Release_Date AS [DateKey],
CONVERT (char(8), a.Release_Date, 112) AS [DateKey],
a.Release_Date AS [Date],
DATEPART(YEAR, a.Release_Date) AS [Year], -- calendar year
DATEPART(QQ, a.Release_Date) AS [Quarter], -- calendar quarter
CASE (qq, a.Release_Date)
WHEN 1 THEN 'First'
WHEN 2 THEN 'Second'
WHEN 3 THEN 'Third'
WHEN 4 THEN 'Fourth'
END AS [QuarterName],
DATEPART(MONTH, a.Release_Date) AS [Month], -- month number of the year
DATENAME(MM, a.Release_Date) AS [MonthName], -- month name
DATEPART(DAY, a.Release_Date) AS [Day], -- day number of the month
DATEPART(DW, a.Release_Date) AS [DayofWeek], -- day number of week
CASE datepart(DW, a.Release_Date)
WHEN 1 THEN 'Monday'
WHEN 2 THEN 'Tuesday'
WHEN 3 THEN 'Wednesday'
WHEN 4 THEN 'Thursday'
WHEN 5 THEN 'Friday'
WHEN 6 THEN 'Saturday'
WHEN 7 THEN 'Sunday'
END AS [WeekName]
FROM
dbo.Album AS a
此代码不起作用,有关如何修复它的任何帮助?非常感谢你 如果我理解正确,您希望填充
DimDateAlbum
表。我已经编辑了一点您的表(添加了标识约束以避免手动写入此字段),现在看起来如下所示:
CREATE TABLE [DimDateAlbum]
(
[DateKey] INT IDENTITY CONSTRAINT PK_DimDateAlbum_ID PRIMARY KEY,
[Date] DATETIME NOT NULL,
[Year] INT NOT NULL,
[Quarter] TINYINT NOT NULL,
[QuarterName] VARCHAR(50) NOT NULL, -- January to March: First, April to
[Month] TINYINT NOT NULL,
[MonthName] VARCHAR(9) NOT NULL, -- January, February etc
[Day] TINYINT NOT NULL, -- Field holds day number of Month
[DayofWeek] TINYINT NOT NULL,
[WeekName] VARCHAR(50) NOT NULL, -- Field displays 1: Monday, 2: Tuesday etc
)
现在您可以插入数据了。我添加了一个测试变量来插入一行,但是它可以用于从表中插入:
INSERT INTO dbo.DimDateAlbum
(
DateKey,
Date,
Year,
Quarter,
QuarterName,
Month,
MonthName,
Day,
DayofWeek,
WeekName
)
SELECT
CAST(a.Release_Date AS DATETIME)
, YEAR(CAST(a.Release_Date AS DATETIME)) --
, DATEPART(QUARTER, CAST(a.Release_Date AS DATETIME)) -- Quarter
, CASE -- Quarter Name
WHEN DATEPART(QUARTER, CAST(a.Release_Date AS DATETIME)) = 1 THEN 'January to March' -- Quarter Name
WHEN DATEPART(QUARTER, CAST(a.Release_Date AS DATETIME)) = 2 THEN 'April to June' -- Quarter Name
WHEN DATEPART(QUARTER, CAST(a.Release_Date AS DATETIME)) = 3 THEN 'July to September' -- Quarter Name
WHEN DATEPART(QUARTER, CAST(a.Release_Date AS DATETIME)) = 4 THEN 'October to December' -- Quarter Name
END
, MONTH(CAST(a.Release_Date AS DATETIME)) -- Month number
, DATENAME(MONTH, DATEADD( MONTH, MONTH(CAST(a.Release_Date AS DATETIME)), 0) - 1) -- Month name
, DAY(CAST(a.Release_Date AS DATETIME)) -- 6
, DATEPART(dw, CAST(a.Release_Date AS DATETIME)) -- 5
, DATENAME(dw, CAST(a.Release_Date AS DATETIME)) -- Thursday
FROM Album a
工作示例:
DECLARE @FooDate VARCHAR(30) = '2018-12-06 12:10:51.727'
INSERT INTO dbo.DimDateAlbum
(
DateKey,
Date,
Year,
Quarter,
QuarterName,
Month,
MonthName,
Day,
DayofWeek,
WeekName
)
SELECT
CAST(@FooDate AS DATETIME)
, YEAR(CAST(@FooDate AS DATETIME)) --
, DATEPART(QUARTER, CAST(@FooDate AS DATETIME)) -- Quarter
, CASE -- Quarter Name
WHEN DATEPART(QUARTER, CAST(@FooDate AS DATETIME)) = 1 THEN 'January to March' -- Quarter Name
WHEN DATEPART(QUARTER, CAST(@FooDate AS DATETIME)) = 2 THEN 'April to June' -- Quarter Name
WHEN DATEPART(QUARTER, CAST(@FooDate AS DATETIME)) = 3 THEN 'July to September' -- Quarter Name
WHEN DATEPART(QUARTER, CAST(@FooDate AS DATETIME)) = 4 THEN 'October to December' -- Quarter Name
END
, MONTH(CAST(@FooDate AS DATETIME)) -- Month number
, DATENAME(MONTH, DATEADD( MONTH, MONTH(CAST(@FooDate AS DATETIME)), 0) - 1) -- Month name
, DAY(CAST(@FooDate AS DATETIME)) -- 6
, DATEPART(dw, CAST(@FooDate AS DATETIME)) -- 5
, DATENAME(dw, CAST(@FooDate AS DATETIME)) -- Thursday
你说什么是发布日期?在你的程序中我看不到发布日期。我只是在里面贴了张照片。我的意思是,我想将相册(发行日期)日期时间分解为一年、一季度、一个月、一周等。但是,我不知道如何从发行日期列中提取所有数据并插入到DimDateAlbum中。例如,2017-10-17的第一个日期应该是:DateKey:20171017,日期年份:2017,季度:4,季度名称:Forth,等等。既然您已经将发布日期作为日期,为什么要使用整数[DateKey]?您完全不应该做任何事情,您的事实表已经可以在Release_Date=[Date]上连接到时间维度,您的意思是我不必创建任何ETL存储过程吗?对不起,我是ETL的新手,所以我很困惑,因为时间维度表中没有数据,所以我必须先从相册中提取数据。你不应该破坏任何东西。您可以创建日历,然后将表加入其中。在结果集的每一行中,你会看到年、季和日,这就是创建DateTime的意义