我的问题是如何从规范化表创建非规范化(OLAP)表。
我有一些数据的 OLTP 数据库。见下表:
请特别注意“Variable”、“Variable_Value”和“Variable_Sample”表。
多变的:
变量值:
变量样本:
创建表“Variable_Sample”的脚本见下文:
ALTER PROCEDURE [dbo].[VarSample]
AS
BEGIN
truncate table UIR_DB.dbo.Variable_Sample
Declare params cursor for
Select distinct id_variable from UIR_DB.dbo.Variable_Value
open params
Declare @idparam int
Declare @csql nvarchar(max) = ''
Declare @csql2 nvarchar(max) = ''
Declare @i int = 1
fetch next from params into @idparam
while @@FETCH_STATUS = 0
begin
Select @csql2 = @csql2 + ', param' +LTrim(Str(@i))
Select @csql = @csql + ' (Select value as param'+LTrim(Str(@i))+' from UIR_DB.dbo.Variable_Value where id_variable = '+LTrim(Str(@idparam))+') a'+LTrim(Str(@i))+' cross join'
Set @i = @i+1
fetch next from params into @idparam
end
Select @csql = '
Insert INTO UIR_DB.dbo.Variable_Sample SELECT id, CAST(SubString(Param,6,LEN(Param)-5) as int) param_id, param_val
FROM
(Select ROW_Number() over(order by '+SubString(@csql2,2,LEN(@csql2)-1)+') id, '+SubString(@csql2,2,LEN(@csql2)-1)+' from '+SubString(@csql,1,LEN(@csql)-11) + ') p
UNPIVOT
(param_val FOR Param IN
('+SubString(@csql2,2,LEN(@csql2)-1)+')
)AS unpvt
'
print @csql
exec sp_executesql @csql
delete from Sample
Insert into Sample select distinct UIR_DB.dbo.Variable_Sample.idsample from UIR_DB.dbo.Variable_Sample
close params
deallocate params
END
我需要创建表格,类似于“Variable_Sample_Olap”的表格:
变量_Sample_Olap:
(当然,如果它是 variable3、...、variableN,那么它将是“Variable_Sample_Olap”中的 N 列。)
有人可以帮我编写将 Variable_Sample 转换为 Variable_Sample_Olap 的脚本吗?