2013-05-19 3 views
1

표 :SQL : 피 중복 데이터

Person_ID Name Salary_Revisions 
1   Test1 100 
1   Test1 200 
2   Test2 300 
2   Test2 400 

표 2 : 실제

Person_ID    Name    Salary_Revisions  Department 
--------------------- ------------------ ---------------------- -------------- 
1      Test1    100     Physics 
1      Test1    200     Chemistry 
2      Test2    300     Maths 
2      Test2    400 

:

Person ID   Name  Salary Revisions  Department 
------------------ --------- --------------------- ---------------- 
1     Test1  100     Physics 
1     Test1  200     Physics 
1     Test1  100     Chemistry 
1     Test1  200     Chemistry 
2     Test2  300     Maths 
2     Test2  400     Maths 
싶습니다
Person ID     Department 
-------------------------- ---------------- 
1       Physics 
1       Chemistry 
2       Maths 

같은 결과를 얻을 수 0

예상 결과와 같이 구현하도록 도와 주시겠습니까?

이것을 구현하는 동안 사람 ID를 사용하여 표 1을 표 2와 결합하여 왼쪽에 저장 프로 시저를 작성했습니다. 데이터베이스에서 쿼리를 실행하면 실제 결과와 같이 반환됩니다.

SQL 쿼리 :

SELECT table1.person_ID, table1.name, table1.salary_revisions, table2.department 
from table1 
left outer join table2 on table1.person_id=table2.person_id 
+3

'Salary_Revisions = 400'이있는 행은 어디에서 왔습니까? 기본 테이블에있는 것 같지 않습니다 .... 당신은 ** 당신의 논리를 설명 할 필요가 있습니다 ** - 여기서 우리에게 보여주고있는 데이터의 비트로부터 명확하지 않습니다 ... –

+0

어떻게 결정합니까? 사람 1은 물리학 부서에 100 건의 급여 개정이 있었고 화학 부서에는 없었습니다. – Andomar

+0

죄송합니다 .. 나는 salary_revisions = 400을 놓쳤습니다. 데이터를 수정했습니다. – user2395176

답변

1

개정 및 부서 사이에 관계가 없다는 의견을 감안할 때 그것은 목록을 사용하는 의미가 있습니다. 쉼표로 구분 된 것이 좋습니다. 이처럼 : 여기

PERSON_ID NAME SALARY REVISION LIST DEPARTMENT LIST 
---------- ------ --------------------- ------------------------ 
1   Test1 100, 200    Physics, Chemistry 
2   Test2 300, 400    Maths 

쿼리입니다 :

SELECT DISTINCT 
     Person_ID, 
     Name, 
     STUFF((SELECT ', ' + CAST(S.Salary_Revisions AS VARCHAR(50)) 
       FROM Table1 S 
       WHERE S.Person_ID = P.Person_ID 
       FOR XML PATH ('')),1,2,'') AS [Salary Revision List], 
     STUFF((SELECT ', ' + D.Department 
       FROM Table2 D 
       WHERE D.Person_ID = P.Person_ID 
       FOR XML PATH ('')),1,2,'') AS [Department List] 
FROM Table1 P 

을 그리고 여기에 바이올린입니다 : http://sqlfiddle.com/#!3/27c07/3/0


원래 대답 잘

이 쉽게 할 것 하지만 이해할 수없는 비즈니스 규칙의 일부가 있습니다. 이 행에 부서가없는 이유는 무엇입니까?

Person_ID    Name    Salary_Revisions  Department 
--------------------- ------------------ ---------------------- -------------- 
2      Test2    400 

400에서 300에서 사용자 2의 차이와 사용자 2을 의미한다 표 2에 대해 아무것도 없다.

당신의 시스템에 어떤 데이터가 당신이 보여 결과가 올바른지 의미 - 결과도 할 수 없습니다

Person_ID    Name    Salary_Revisions  Department 
--------------------- ------------------ ---------------------- -------------- 
1      Test1    100     Physics 
1      Test1    200     Chemistry 
2      Test2    300      
2      Test2    400     Maths 

또는

Person_ID    Name    Salary_Revisions  Department 
--------------------- ------------------ ---------------------- -------------- 
1      Test1    100     Physics 
1      Test1    200     Chemistry 
2      Test2    300     Maths 
2      Test2    400     Maths 

당신은 데이터가없는 경우 논리적으로 올바른 것을 선택하면이 쿼리를 수행 할 방법이 없습니다.

행의 순서가 다를 수도 있습니다 (SQL의 경우 매우 이상합니다). 어쩌면 데이터 모델에 넣지 않은 데이터가 필요합니까?

+0

대표자를 찾고 싶습니다. Person_ID 1에 두 개의 급여 개정과 두 개의 부서가있는 것 같습니다. Person_ID 2에는 두 개의 급여 개정 W 하나의 부서가 있습니다. 논리적으로 데이터를 가져올 방법이 없다는 것을 알고 있습니다. 그러나 나는 표창을 받고 싶다. 감사합니다. – user2395176

+0

@ user2395176 - 확인, 목록을 선택하려면 업데이트를 참조하십시오. – Hogan

1

사용 시나리오를 이해할 수 없지만 원하는 내용이라고 생각합니다.

1 인당 각 열에 대해 고유 한 값을 모두 가져 오는 CTE 2 개와 행별로 행을 결합하는 FULL OUTER JOIN.

WITH salary_revision AS (
    SELECT person_id, name, salary_revisions sr, 
    ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY person_id) row 
    FROM table1 
), department AS (
    SELECT person_id, department, 
    ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY person_id) row 
    FROM table2 
) 
SELECT sr.person_id,sr.name, sr.sr, d.department 
FROM salary_revision sr 
FULL OUTER JOIN department d 
    ON sr.person_id = d.person_id 
AND sr.row = d.row 

An SQLfiddle to test with.

+0

안녕하세요 요아킴, 전 테이블 2에서 모든 부서를 얻으려고 합니다만, 중복되지 않고 최대 (부서)가 아닙니다. 감사합니다 – user2395176

+0

@ user2395176 업데이트를 참조하십시오. –

+0

안녕하세요, 요아킴, 전 모든 person_ids 가입 후 싶습니다. 내 표 2에 person_ID 1에 대한 세 개의 부서가 포함 된 경우 어떻게해야합니까? 제발 .... – user2395176

-1
WITH salary_revision AS (
    SELECT person_id, name, salary_revisions sr, 
    ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY person_id) row 
    FROM table1 
    ), department AS (
    SELECT person_id, department, 
    ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY person_id) row 
    FROM table2 
    ) 

SELECT COALESCE (sr.person_id, d.person_id) sr.name, sr.sr, ON salary_revision의 SR FULL OUTER 부서 D 가입 FROM d.department sr.person_id = d.person_id AND sr.row = d.row

COALESCE에게 첫 번째로 null이 아닌 값을 고려해야합니다. 그래서 우리는 각 행에 peson_id를 얻습니다.