3

一般的な「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])

これらのテーブルには、多数のディメンションとディメンションメンバーが格納されます。

可変数の次元から次元メンバーを相互結合したい。例:「性別」、「雇用タイプ」、「契約タイプ」ディメンションのクロス結合ディメンションメンバーは、次の組み合わせを生成する必要があります

'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'

組み合わせのラベルは、ディメンションメンバーのラベルを連結して作成する必要があります(上記のとおり)。

前もって感謝します

アップデート

ディメンションのリスト(たとえば、「性別」、「雇用タイプ」、「契約タイプ」)は動的です(実行時に別のクエリによって生成されます)。

更新2

小さなエラーを修正しました(Dimension1-> Dimension)。ごめん!

4

1 に答える 1

5

このパターンはどうですか?(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

確かに、構築するサブクエリの数、したがってSELECTの連結部分の長さを知る必要があります。


編集

そして、これがすべてを実行するものです(更新されたSQL Fiddle

;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)
于 2012-09-26T10:57:09.720 に答える