このタイプの変換は、ピボットと呼ばれます。使用しているデータベースを指定しませんでしたが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 を参照してください
データベースによっては、 関数PIVOT
とUNPIVOT
関数の両方にアクセスできる場合、それらを使用して結果を取得できます。このUNPIVOT
関数は、列IndividualPay
とFamilyPay
列を行に変換します。それが完了したら、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 |