0

私はテーブルに次のものを持っていますTopTenBrands:

Brands             Cust_ID
------------------------------    
Hitachi           16402, 16407    
Hitachi           16409, 16428    
JVC               19301, 19308    
LG                21001, 21007    
LG                21001, 21007, 21008    
LG                21001, 21008    
Panasonic         27909, 27912    
Philips           28501, 28518    
Philips           28513, 28516

上の表では、3 つの行を持つ LG ブランドがあります。

LG                21001, 21007    
LG                21001, 21007, 21008    
LG                21001, 21008

しかし、出力テーブルでは、結果をfallowsとして取得したい

Brands             Cust_ID
------------------------------
Hitachi           16402, 16407    
Hitachi           16409, 16428    
JVC               19301, 19308    
LG                21001, 21007, 21008    
Panasonic         27909, 27912    
Philips           28501, 28518    
Philips           28513, 28516

重複を削除して一意の ID を保持したいのですが、ID をブランド別にグループ化したくありません。

どうすればいいですか?

4

3 に答える 3

1

これを試して

Declare @t  table(Brands Varchar(20),Cust_Id Varchar(100))
Insert Into @t 
Select 'Hitachi','16402, 16407' Union ALL Select 'Hitachi','16409, 16428' Union All
Select 'JVC','19301, 19308' Union All Select 'LG','21001, 21007' Union All    
Select 'LG','21001, 21007, 21008'  Union All Select 'LG','21001, 21008' Union All
Select 'Panasonic','27909, 27912 ' Union All Select 'Philips','28501, 28518'  Union All  
Select 'Philips','28513, 28516'


;WITH CTE AS
(
SELECT 
Rn = ROW_NUMBER() OVER(PARTITION BY LTRIM(RTRIM(Y.SplitCust_Id)),Brands ORDER BY (SELECT 1))
 ,X.Brands
 ,X.Cust_Id
 ,SplitCust_Id =LTRIM(RTRIM(Y.SplitCust_Id))
 FROM(SELECT *,CAST('<X>'+REPLACE(F.Cust_Id,',','</X><X>')+'</X>' AS XML) AS xmlfilter
      FROM @t F)X CROSS APPLY
     (SELECT fdata.D.value('.','varchar(50)') AS SplitCust_Id 
      FROM X.xmlfilter.nodes('X') AS fdata(D)) Y
)
,CTE_FINDProductsToMerge AS
( 
    SELECT Distinct Brands,SplitCust_Id 
    FROM CTE 
    WHERE Brands NOT IN (SELECT Brands FROM @t WHERE Rn=1)
)
,CTE2 AS
(
    SELECT c1.Brands, Cust_Id  = STUFF(
            ( SELECT ',' + CAST(SplitCust_Id AS VARCHAR(1000)) 
                FROM CTE_FINDProductsToMerge c2
                WHERE  c1.Brands = c2.Brands
                FOR XML PATH('')),1,1,''
            )
    FROM CTE_FINDProductsToMerge c1
    GROUP BY Brands
)

SELECT Brands,Cust_Id FROM @t  WHERE Brands NOT IN (SELECT Brands From CTE2)
UNION ALL
SELECT Brands,Cust_Id From CTE2
ORDER BY 2

出力:

Brands  Cust_Id
Hitachi 16402, 16407
Hitachi 16409, 16428
JVC 19301, 19308
LG  21001,21007,21008
Panasonic   27909, 27912 
Philips 28501, 28518
Philips 28513, 28516
于 2012-08-29T12:03:57.667 に答える
1

duplicate を削除したい場合はBrands、次のようにします。

SELECT brand, 
(SELECT top 1 cust_ID 
        FROM TopTenBrands 
        WHERE brand = ttb.brand) 
FROM TopTenBrands ttb
GROUP BY brand;

使いたくない場合GROUP BY

SELECT DISTINCT brand, 
(SELECT top 1 cust_ID 
        FROM TopTenBrands 
        WHERE brand = ttb.brand) AS cust_ID
FROM TopTenBrands ttb;

このSQLFiddleを参照してください

于 2012-08-29T10:30:43.803 に答える
0

最初に連結結果をグループ化し、それらを一時テーブルに挿入する必要があります。次に、一時テーブルを反復処理し、行ごとにこのようなことを行い、区切り記号で区切られた個別の行を選択し、その行の一時テーブルを更新します。

具体的なデータ モデルはわかりませんが、テーブル スキーマを効率的に整理できると思います。

于 2012-08-29T10:09:32.990 に答える