2013-03-14 5 views
7

मैंकैसे एसक्यूएल में एक पंक्ति में दो पंक्तियों विलय करने के लिए?

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

के रूप में एक मेज है लेकिन मैं उत्पादन चाहते हैं के रूप में इस

EmployeeID IndPay_IsActive IndPay_IsNotActive FamilyPay_IsActive FamilyPay_IsNotActive 
    1   200     100    300     150 

मैं PIVOT में देखा है (मैं कुछ अन्य तालिका के साथ आंतरिक शामिल होने के लिए इस उत्पादन का उपयोग करना चाहते हैं), लेकिन सुनिश्चित नहीं है कि मेरे मामले में इसका उपयोग कैसे करें।

+4

हाँ, आप एक धुरी क्वेरी चाहते हैं, लेकिन वाक्य रचना डेटाबेस प्रणाली से भिन्न होता है। आप किसका उपयोग कर रहे हैं – Alkini

उत्तर

21

परिवर्तन के इस प्रकार के एक धुरी के रूप में जाना जाता है। आप निर्दिष्ट नहीं किया क्या डेटाबेस का उपयोग कर रहे हैं लेकिन कोई भी प्रणाली में एक CASE अभिव्यक्ति के साथ एक समग्र समारोह का उपयोग कर सकते हैं:

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

अपने डेटाबेस के आधार पर आप दोनों PIVOT के लिए उपयोग किया है, तो और UNPIVOT काम करता है, तो वे परिणाम प्राप्त करने के लिए इस्तेमाल किया जा सकता है। UNPIVOT समारोह पंक्तियों में IndividualPay और FamilyPay कॉलम बदल देता है। एक बार यह हो जाता है, तो आप 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

मैं वह नहीं हूं जो डाउनवॉटेड है, लेकिन आपका केस निर्माण मेरे लिए अपूर्ण दिखता है। उनके पास "अन्य" हिस्सा नहीं है। –

+1

@DanBracuk 'CASE' का उपयोग करते समय' else' की आवश्यकता नहीं है, यह शामिल नहीं है तो कॉलम में 'शून्य' रखा जाएगा। – Taryn

+1

यह समाधान त्वरित प्रतिक्रिया के लिए me..Thanks के लिए काम करता है। – 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' 
संबंधित मुद्दे

 संबंधित मुद्दे