0

3 つのテーブルを JOIN し、複数の行からのデータを個別の列の DISTINCT 行ごとに集計します

1 つのアイテムが複数のアイテムにマップされているテーブルがあります。

Key 1 | Key 2
1       2
1       5
1       6
1       4
1       8

このようなテーブルがもう 1 つあります。

Key 1 | ShortKey1Desc
1       'Desc short'

このようなデータがあるテーブルがもう1つあります

Key 1 | Description
1       'Desc a'
1       'Desc c'
1       'Desc aa'
1       'Desc tt'

このようにテーブルが生成されるビューの SQL クエリを記述する必要があります

Key 1 | AllKeys2ForKey1 | AllDescriptionsForKey1           | ShortKey1Desc
1     | 2;5;6;4;8       | Desc a; Desc c; Desc aa; Desc tt | Desc short

キー 1 は文字列型のフィールドなので、その文字列キーを使用してテーブルを結合する必要があります

私がしようとしているのは、快適なデータ アクセスのためのビューを作成することです。何年もかからないクエリを作成する必要があります。私はすでに関数でそれをやろうとしましたが、ロードに時間がかかります。

これについての助けをいただければ幸いです。どうもありがとう

4

3 に答える 3

1

より効率的なクエリを作成するためにデータ構造を変更できないと仮定すると、これは機能します。

--Populate sample data
SELECT 1 as key1,       2  as key2 INTO #tbl1
UNION ALL SELECT 1,       5 
UNION ALL SELECT 1,       6 
UNION ALL SELECT 1,       4 
UNION ALL SELECT 1,       8 

SELECT 1  as key1,     'Desc short' as shortkeydesc INTO #tbl2

SELECT 1   as key1,    'Desc a'  as [description] INTO #tbl3
UNION ALL SELECT 1,       'Desc c' 
UNION ALL SELECT 1,       'Desc aa' 
UNION ALL SELECT 1,       'Desc tt' 

--Combine data into semi-colon separated lists
SELECT 
key1
,STUFF(
    (
    SELECT
      ';' + CAST(t2.key2 AS VARCHAR(10))
    FROM #tbl1 t2
    WHERE t2.key1 = tbl1.key1
    FOR XML PATH('')
    ), 1, 1, ''
  )
,STUFF(
    (
    SELECT
      ';' + tbl2.shortkeydesc
    FROM #tbl2 tbl2
    WHERE tbl2.key1 = tbl1.key1
    FOR XML PATH('')
    ), 1, 1, ''
  )
,STUFF(
    (
    SELECT
      ';' + tbl3.[description]
    FROM #tbl3 tbl3
    WHERE tbl3.key1 = tbl1.key1
    FOR XML PATH('')
    ), 1, 1, ''
  )
FROM #tbl1 tbl1
GROUP BY tbl1.key1
于 2012-05-15T11:19:32.290 に答える
0

この質問を解決するには、CLR 集計関数を記述する必要があります。for write CLR Aggregate Function : 1: Microsoft Visual Stadio を実行する 2: 新しいプロジェクトを作成する 3: 次に、データ プロジェクトを選択する 4: CLR Aggregate Function

集計関数を作成した後、以下のようなクエリを作成します

 Select A.Key1, OwnAggregateFn(B.Description), OwnAggregateFn(C.Key2), ...
 From A
 inner join B ON B.Key1 = A.Key1
 inner join C ON C.Key1 = A.Key1
 ... 
 Group By A.Key1
于 2012-05-21T23:17:00.480 に答える
0

行を 1 つの結果に変換するには、変数に値を保存する必要があります。以下は、アイデアを提供するためのサンプル コードです。

Declare @AllKeys2ForKey1 varchar(50)
set @AllKeys2ForKey1 = ''
SELECT @AllKeys2ForKey1 = @AllKeys2ForKey1  + cast([Key 2] as varchar(3)) + ','
  FROM [AllKeys2ForKey1Table] where [KEY 1] = 1


Declare @AllDescriptionsForKey1 varchar(100)
set @AllDescriptionsForKey1 = ''
SELECT @AllKeys2ForKey1 = @AllKeys2ForKey1  + [Description] + ','
  FROM [AllDescriptionsForKey1Table] where [KEY 1] = 1

Declare @ShortKey1Desc varchar(100)
set @ShortKey1Desc = ''
SELECT @ShortKey1Desc = @ShortKey1Desc  + [ShortKey1Desc] + ','
  FROM [ShortKey1DescTable] where [KEY 1] = 1  


Select [KEY 1], 
        substring(@AllKeys2ForKey1,1,len(@AllKeys2ForKey1) - 1) as 'AllKeys2ForKey1 ',
        substring(@AllDescriptionsForKey1,1,len(@AllDescriptionsForKey1) - 1) as 'AllDescriptionsForKey1',
        substring(@ShortKey1Desc,1,len(@ShortKey1Desc) - 1)  as 'ShortKey1Desc'
from Table where [KEY 1]= 1 
于 2012-05-15T09:45:59.027 に答える