2013-03-14 9 views
7

Mam tabeli jakoJak połączyć dwa wiersze w jeden wiersz w sql?

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

Ale chcę wyjście następująco (chcę użyć tego wyjścia do wewnętrznej przyłączyć się do innej tabeli)

EmployeeID IndPay_IsActive IndPay_IsNotActive FamilyPay_IsActive FamilyPay_IsNotActive 
    1   200     100    300     150 

Mam spojrzał na PIVOT, ale nie wiem, jak go użyć w moim przypadku.

+4

Tak, chcesz zapytać obrotowy, ale składnia zależy od systemu bazy danych. Którego używasz? – Alkini

Odpowiedz

21

Ten typ przemiany jest znany jako osi. Nie określono, co baza danych używasz, ale można użyć funkcji zagregowanego z wyrażeniem CASE w dowolnym systemie:

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 

Zobacz SQL Fiddle with Demo

zależności od bazy danych, jeśli masz dostęp do obu PIVOT i UNPIVOT funkcji, a następnie mogą być używane do uzyskania wyniku. Funkcja UNPIVOT przekształca kolumny w kolumny IndividualPay i FamilyPay. Gdy to zrobisz, to można utworzyć cztery nowe kolumny z funkcją 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 

Zobacz SQL Fiddle with Demo.

Obydwa dają ten sam rezultat:

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

Nie jestem tym, który zaaprobował, ale twoje konstrukcje spraw wyglądają na niekompletne. Nie mają części "innej". –

+1

@DanBracuk 'else' nie jest wymagany, gdy używasz' CASE', nie jest ono zawarte, wtedy '' null' będzie umieszczone w kolumnie. – Taryn

+1

To rozwiązanie działa dla mnie. Dzięki za szybką odpowiedź. – 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'