2013-04-05 3 views
1

하나의 자료에 하나 이상의 구성 요소가있는 자료 정보가있는 테이블이 있습니다.SQL Server에서 중복 행 그룹 찾기

표는 다음과 같습니다

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 

을 일반적으로, 나는 '의 (s와 중량 %,뿐만 아니라 같은과 같은 구성 ID를 동일 성분 ID 모두)과의'의 다른 물질 ID을 가질 수 있습니다 중량 %는 여러 물질에있을 수 있습니다.

정확히 동일한 성분, 동일한 구성 성분의 ID 및 동일한 중량 퍼센트 (재료 ID 1 및 3이 될 데이터의 예에서)가 동일한 재료 인 ID을 찾으십시오. 무엇이 좋을까요?

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

,691 : 같은 출력을 가지고

질문을 명확히하기 위해서 : 나는 수천 개의 재료를 가지고 있는데, 나는 단지 ID가 중복 된 행을 얻는다면 도움이되지 않을 것입니다 - 중복 재료 ID의 그룹을 얻는 것이 가능한지보고 싶습니다. 동일한 행 또는 필드.

답변

2

모든 구성 요소가 포함 된 CTE에 XML 문자열을 작성하고 해당 문자열을 사용하여 중복 자료를 찾습니다.

SQL Fiddle

MS SQL 서버 2008 스키마 설정 : 1

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); 

검색어 :

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 

Results :

| ID | MATERIALIDS | 
-------------------- 
| 1 |   1,3 | 
+0

미카엘, 덕분에 다음과 같은 코드를 사용할 수 있습니다. 결과로 얻은 것은 사용 된 물질과 연관된 중량 퍼센트를 가진 구성 성분입니다. 난 거의 반전 된 결과가 필요합니다 - 1 열 번호 (id), 2 - 쉼표로 구분 된 동일한 재료 ID (각 구성 요소와 동일한 중량 퍼센트를 가짐) – user2250303

+0

@ user2250303 오케이, 네가 원하는 걸 내가 아는 것 같아. 당신은 정확하게 동일한 구성 요소를 가진 자료를 찾고 싶습니까? 케이크를 베이킹하기위한 모든 동일한 조리법을 찾는 것처럼 케이크가 어디에 있는지 생각하고있는 방식으로 나는 당신의 세계와 성분이 재료 인 것과 동일합니다. –

+1

+1 이상 주문 (1/0 주문) –

0

그럼 당신은 중복 값을 얻을 수

Select EMP_NAME as NameT,count(EMP_NAME) as DuplicateValCount From dbo.Emp_test 
group by Emp_name having count(EMP_NAME) > 1