2

1 つの材料に 1 つから複数の成分が含まれる材料情報を含むテーブルがあります。

テーブルは次のようになります。

material_id contstiuent_id constituent_wt_pct
   1             1              10.5
   1             2              89.5
   2             1              10.5
   2             5              15.5
   2             7              74
   3             1              10.5
   3             2              89.5

通常、ID同じ成分 (IDと重量パーセントの両方) を持つ異なる材料を使用できますが、同じ重量パーセントの同じ構成 ID を複数の材料に含めることもできます。

IDまったく同じ量の成分、同じ成分 ID、および同じ重量パーセントを持つ材料を見つける必要があります(データの例では、材料 ID 1 と 3 になります)。出力が次のようになるのは素晴らしいことです。

ID Duplicate ID's
1 1,3
2 15,25
....

質問を明確にするために: 私は数千のマテリアルを持っていますが、重複する行の ID だけを取得しても役に立ちません - 同じ行で重複するマテリアル ID のグループを取得できるかどうかを確認したいと思いますまたはフィールド。

4

2 に答える 2

3

すべての構成要素を含む CTE で XML 文字列を作成し、その文字列を使用して重複している材料を特定します。

SQL フィドル

MS SQL Server 2008 スキーマのセットアップ:

create table Materials
(
  material_id int, 
  constituent_id int, 
  constituent_wt_pct decimal(10, 2)
);


insert into Materials values
(1, 1, 10.5),
(1, 2, 89.5),
(2, 1, 10.5),
(2, 5, 15.5),
(2, 7, 74),
(3, 1, 10.5),
(3, 2, 89.5);

クエリ 1 :

with C as
(
  select M1.material_id,
        (
        select M2.constituent_id as I,
                M2.constituent_wt_pct as P
        from Materials as M2
        where M1.material_id = M2.material_id
        order by M2.constituent_id,
                 M2.material_id
        for xml path('')
        ) as constituents
  from Materials as M1
  group by M1.material_id
)
select row_number() over(order by 1/0) as ID,
       stuff((
       select ','+cast(C2.material_id as varchar(10))
       from C as C2
       where C1.constituents = C2.constituents
       for xml path('')
       ), 1, 1, '') as MaterialIDs
from C as C1
group by C1.constituents
having count(*) > 1

結果

| ID | MATERIALIDS |
--------------------
|  1 |         1,3 |
于 2013-04-05T21:21:31.060 に答える