3

以下は私が持っているテーブルの構造です: -

T1

C1  C2  C3
---------- 
X   P   A
X   P   B
Y   Q   C
Y   Q   D

望ましい出力: -

C1   C2   C3
------------ 
X    P    A,B
Y    Q    C,D

注: - For XML('')C1 と C2 で group by を使用して同じことができることはわかっていますが、私の場合の主な問題は、ここのテーブル T1 が物理テーブル オブジェクト (永続的または一時的またはテーブル変数または CTE) でなければならないことです。 DB。しかし、私の場合、それは派生テーブルであり、以下のクエリを使用しているときは、無効なオブジェクトと言っています。私の場合、派生テーブルを temp# テーブルや固定テーブル、さらには CTE やテーブル変数に置き換えるのは、多大な労力がかかるため良くありません。

SELECT 
b.C1, b.C2, Stuff((',' + a.C3 from t1 a where a.c1 = b.c1 for XML PATH('')),1,1,'') FROM
T1 b group by b.c1,b.c2

固定テーブルとして T1 を持っていませんでした。派生テーブルのみとお考えください。

既存の派生テーブルを使用したソリューションが必要です。助けてください。

以下は、派生テーブルを使用したクエリです。 - これはデモ クエリとしてのみ考慮してください。以下に示すほど単純ではなく、派生テーブルを取得するために多くの計算が行われ、4 レベルの派生テーブルが使用されています。

SELECT C1, C2, Stuff((',' + a.C3 from A B where a.c1 = b.c1 for XML PATH('')),1,1,'')
FROM
(
SELECT C1, C2, C3  FROM T1 WHERE C1 IS NOT NULL--and a lot of calculation also
)A

T1 は 1 ステップ下ではないことに注意してください。私の場合、T1 の実際の物理テーブルは、派生テーブルによって 4 レベル下がっています。

4

1 に答える 1

3

派生テーブルを生成するクエリを投稿できる場合は、それを解決するのに役立ちますtable1が、現時点では、派生クエリに置き換えてみてください。

;WITH Table1
AS
(
    SELECT C1, C2, C3  FROM T1 WHERE C1 IS NOT NULL--and a lot of calculation also
)
SELECT
     C1,C2,
     STUFF(
         (SELECT ',' + C3
          FROM Table1
          WHERE C1 = a.C1 AND C2 = a.C2
          FOR XML PATH (''))
          , 1, 1, '')  AS NamesList
FROM Table1 AS a
GROUP BY C1,C2
于 2013-01-24T06:10:00.037 に答える