15

私はテーブルを持っています

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

2 に答える 2

32

このタイプの変換は、ピボットと呼ばれます。使用しているデータベースを指定しませんでしたが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 を参照してください

データベースによっては、 関数PIVOTUNPIVOT関数の両方にアクセスできる場合、それらを使用して結果を取得できます。この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 |
于 2013-03-14T13:58:30.387 に答える
4
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'
于 2013-03-14T14:11:14.947 に答える