Max*_*eev 3 sql sql-server join cross-join
我有一个通用的"Dimension"和"DimensionMember"表.
CREATE TABLE [dbo].[Dimension]
(
[ID] [int] NOT NULL IDENTITY(1, 1),
[Label] [nvarchar] (255)
)
CREATE TABLE [dbo].[DimensionMember]
(
[ID] [int] NOT NULL IDENTITY(1, 1),
[Label] [nvarchar] (255) NOT NULL,
[DimensionID] [int] NOT NULL
)
GO
ALTER TABLE [dbo].[DimensionMember] ADD CONSTRAINT [FK_DimensionMember_DimensionID_Dimension_ID] FOREIGN KEY ([DimensionID]) REFERENCES [dbo].[Dimension] ([ID])
Run Code Online (Sandbox Code Playgroud)
这些表存储了大量维度和维度成员.
我想从可变数量的维度交叉连接维度成员.示例:来自"性别","就业类型","合同类型"维度的交叉连接维度成员应生成以下组合
'Male,Full time, Employee'
'Female,Full time, Employee'
'Male,Part time, Employee'
'Female,Part time, Employee'
'Male,Full time, Contractor'
'Female,Full time, Contractor'
'Male,Part time, Contractor'
'Female,Part time, Contractor'
Run Code Online (Sandbox Code Playgroud)
应通过连接维成员的标签来创建组合的标签(如上所示).
先感谢您
维度列表(例如"性别","就业类型","合同类型")是动态的(在运行时由另一个查询生成).
修正了一个小错误(Dimension1 - > Dimension).抱歉!
这种模式怎么样?(SQL小提琴)
select a.label+','+b.label+','+c.label
from (select m.label from dimension1 d
join dimensionmember m
on m.dimensionid = d.id and d.label = 'sex') a
cross join (select m.label from dimension1 d
join dimensionmember m
on m.dimensionid = d.id and d.label = 'Employment Type') b
cross join (select m.label from dimension1 d
join dimensionmember m
on m.dimensionid = d.id and d.label = 'Contract Type') c
Run Code Online (Sandbox Code Playgroud)
当然,您需要知道要构建多少个子查询,因此需要知道SELECT中的连接部分需要多长时间.
编辑
这里有一个完成所有(更新的SQL小提琴)
;with base as (
select m.label, d.id, dense_rank() over (order by d.id) rk
from dimension1 d
join dimensionmember m
on m.dimensionid = d.id
where d.label in ('sex','Employment Type','Contract Type')
), cte as (
select cast(label as varchar(max)) list, rk
from base
where rk=1
union all
select cast(cte.list+','+base.label as varchar(max)), base.rk
from cte
join base on base.rk=cte.rk+1
)
select list
from cte
where rk=(select max(rk) from base)
Run Code Online (Sandbox Code Playgroud)