2013-03-14 11 views
7

BenSQL'de bir satırda iki satır nasıl birleştirilir?

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

olarak bir tablo var ama şöyle ben PIVOT içine baktım

EmployeeID IndPay_IsActive IndPay_IsNotActive FamilyPay_IsActive FamilyPay_IsNotActive 
    1   200     100    300     150 

(Ben iç diğer bir tablo ile katılmak için bu çıktıyı kullanmak istiyorum) çıkışını istiyorum ama Benim durumumda nasıl kullanılacağını bilmiyorum.

+4

Evet, pivot sorgusu istiyorum ama sözdizimi veritabanı sistemi tarafından değişir:

İkisi

aynı sonucu verir. Hangisini kullanıyorsun? – Alkini

cevap

21

Bu tür bir dönüşüm, pivot pivot olarak bilinir. Sen kullandığınız ne veritabanı belirtmedi ancak herhangi sistemde bir CASE ifade ile bir toplama işlevi kullanabilirsiniz: Her iki PIVOT erişiminiz varsa

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 

, veritabanınızda bağlı SQL Fiddle with Demo

Bkz ve UNPIVOT işlevleri, daha sonra sonuçları elde etmek için kullanılabilir. UNPIVOT fonksiyon satırlara IndividualPay ve FamilyPay sütunları dönüştürür. Bu işlem tamamlandıktan sonra, o zaman PIVOT fonksiyonu ile dört yeni sütunlar oluşturabilirsiniz:

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 bakınız.

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

Reddeden kişi ben değilim, ama senin durumun kurguları bana eksik görünüyor. Onların "başka" bir parçası yok. –

+1

@DanBracuk Bir 'CASE' kullanılırken 'else' gerekli değildir, bu dahil edilmezse o zaman sütuna bir' null 'yerleştirilir. – Taryn

+1

Bu çözüm benim için çalışıyor .. Hızlı yanıt için teşekkürler. – 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'