2013-03-14 2 views
7

나는sql에서 두 행을 한 행으로 병합하는 방법은 무엇입니까?

EmployeeID IndividualPay FamilyPay IsActive 
    1   200   300  true 
    1   100   150  false 

같은 테이블을 가지고 있지만 다음과 같이 내가 PIVOT로 보았다

EmployeeID IndPay_IsActive IndPay_IsNotActive FamilyPay_IsActive FamilyPay_IsNotActive 
    1   200     100    300     150 

(I는 내부가 다른 테이블과 조인에이 출력을 사용하려면) 출력을 원하지만, 내 경우에는 그것을 사용하는 방법을 모르겠다.

+4

예, 당신은 피벗 쿼리를 원하지만, 구문은 데이터베이스 시스템에 따라 다릅니다 :

동일한 결과를 제공합니다. 어느 쪽을 사용하고 있습니까? – Alkini

답변

21

이 변환 유형은 피벗으로 알려져 있습니다. 당신은 당신이 사용하고있는 데이터베이스를 지정하지 않은하지만 당신은 어떤 시스템에서 CASE 표현으로 집계 함수를 사용할 수 있습니다 : 당신이 모두 PIVOT에 액세스 할 수있는 경우

select employeeid, 
    max(case when IsActive = 'true' then IndividualPay end) IndPay_IsActive, 
    max(case when IsActive = 'false' then IndividualPay end) IndPay_IsNotActive, 
    max(case when IsActive = 'true' then FamilyPay end) FamilyPay_IsActive, 
    max(case when IsActive = 'false' then FamilyPay end) FamilyPay_IsNotActive 
from yourtable 
group by employeeid 

은 데이터베이스에 따라 SQL Fiddle with Demo

를 참조하십시오 그리고 UNPIVOT 함수를 사용하면 결과를 얻는 데 사용할 수 있습니다. UNPIVOT 함수는 IndividualPayFamilyPay 열을 행으로 변환합니다. 이 작업이 완료되면, 당신은 PIVOT 기능을 가진 네 개의 새 열을 만들 수 있습니다

select * 
from 
(
    select employeeid, 
    case when isactive = 'true' 
     then col+'_IsActive' 
     else col+'_IsNotActive' end col, 
    value 
    from yourtable 
    unpivot 
    (
    value 
    for col in (IndividualPay, FamilyPay) 
) unpiv 
) src 
pivot 
(
    max(value) 
    for col in (IndividualPay_IsActive, IndividualPay_IsNotActive, 
       FamilyPay_IsActive, FamilyPay_IsNotActive) 
) piv 

SQL Fiddle with Demo를 참조하십시오.

| EMPLOYEEID | INDIVIDUALPAY_ISACTIVE | INDIVIDUALPAY_ISNOTACTIVE | FAMILYPAY_ISACTIVE | FAMILYPAY_ISNOTACTIVE | 
---------------------------------------------------------------------------------------------------------------- 
|   1 |     200 |      100 |    300 |     150 | 
+0

나는 downvoted 사람이 아니지만, 당신의 사건 구성이 나에게 불완전 해 보인다. 그들은 "else"부분을 가지고 있지 않습니다. –

+1

@DanBracuk'else'는'CASE'를 사용할 때 필요하지 않습니다. 포함되어 있지 않으면'null'이 열에 배치됩니다. – Taryn

+1

이 솔루션은 나를 위해 작동합니다. 빠른 응답을 주셔서 감사합니다. – user1882705

2
Select 
    EmployeeID, 
    Active.IndividualPay As IndPay_IsActive, 
    Active.FamilyPay As FamilyPay_IsActive, 
    Inactive.IndividualPay As IndPay_IsNotActive, 
    Inactive.FamilyPay As FamilyPay_IsNotActive 
From 
    PayTable Active 
    Join PayTable Inactive On Active.EmployeeID = Inactive.EmployeeId 
     And Inactive.IsActive = 'false' 
Where 
    Active.IsActive = 'true' 
관련 문제