2013-03-14 28 views
7

私はsqlの2つの行を1つの行にマージする方法は?

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 

出力をしたいが、私の場合にどのように使用するかわからない。

+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 

あなたはPIVOT両方へのアクセス権を持っている場合は、データベースによってはSQL Fiddle with Demo

を参照してください。およびUNPIVOT関数を使用すると、それらを使用して結果を得ることができます。 UNPIVOT関数は、IndividualPayFamilyPayの列を行に変換します。それが完了したら、あなたはPIVOT機能を持つ4つの新しい列を作成することができます。

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

私はダウン投票した人ではありませんが、あなたのケース構成は私には不完全です。彼らは "else"の部分を持っていません。 –

+1

@DanBracuk 'CASE'を使用するときには' else'は必要ありません。含まれていない場合、 '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' 
関連する問題