2017-10-05 58 views
1

我真的不知道如何說這個,但我想要將一列的值移動到另一行,根據條件。移動列值和組由

一些UnitNumbers只有一個InsuranceIDs,其他的有兩個。

我想將第二個InsuranceID放在他們自己的列中,但與第一個相同。

我有這樣的:

SELECT v.UnitNumber, InsuranceOrderID, ord.InsuranceID 
FROM Visits v 
INNER JOIN BarInsuranceOrder ord 
    ON ord.VisitID=v.VisitID 

它返回這樣的:

UnitNumber InsuranceOrderID InsuranceID 
---------- ---------------- ----------- 
M7090226   1    UNITEDMCD 
M2133443   1    MCR 
M2133443   2    NEWERASUP 
M2173835   1    MCRCAREIMP 
M2173835   2    MCD 
M2179062   1    MCD 
M2165847   1    AMERIGROUP 

但我期待回到這樣的事情:

UnitNumber InsuranceID SecondaryIns 
---------- ----------- ----------- 
M7090226  UNITEDMCD 
M2133443  MCR   NEWERASUP 
M2173835  MCRCAREIMP MCD 
M2179062  MCD 
M2165847  AMERIGROUP 

這是據我已經得到了,但我認爲它沒有朝着正確的方向發展:

SELECT v.UnitNumber 
, (CASE WHEN InsuranceOrderID = '1' THEN ord.InsuranceID ELSE '-' END) [PrimaryIns] 
, (CASE WHEN InsuranceOrderID = '2' THEN ord.InsuranceID ELSE '-' END) [SecondaryIns] 
FROM Visits v 
INNER JOIN BarInsuranceOrder ord 
    ON ord.VisitID=v.VisitID 


UnitNumber InsuranceID SecondaryIns 
---------- ----------- ----------- 
M7090226 UNITEDMCD - 
M2133443 MCR   - 
M2133443 -   NEWERASUP 
M2173835 MCRCAREIMP - 
M2173835 -   MCD 
M2179062 MCD   - 
M2165847 AMERIGROUP - 

我對SQL相當陌生,所以任何幫助表示讚賞。

回答

0

你非常接近。你只需要聚集:

SELECT v.UnitNumber, 
     MAX(CASE WHEN InsuranceOrderID = 1 THEN ord.InsuranceID END) as [PrimaryIns], 
     MAX(CASE WHEN InsuranceOrderID = 2 THEN ord.InsuranceID END) as [SecondaryIns] 
FROM Visits v INNER JOIN 
    BarInsuranceOrder ord 
    ON ord.VisitID = v.VisitID 
GROUP BY v.UnitNumber; 

注:

  • 我刪除周圍的號碼單引號。推測這些值是數字而不是字符串。
  • 我刪除了ELSE。我的數字NULL已經足夠好了,可以開始使用了 - 並且與您期望的結果更加一致。
+0

這也適用。不需要樞軸。謝謝 – dhyman

0

您可以使用它。

SELECT UnitNumber, [1] InsuranceID, [2] SecondaryIns FROM 
( 
    SELECT v.UnitNumber, InsuranceOrderID, ord.InsuranceID 
    FROM Visits v 
    INNER JOIN BarInsuranceOrder ord 
     ON ord.VisitID=v.VisitID 

) SRC 
PIVOT (MAX(InsuranceID) FOR InsuranceOrderID IN ([1],[2]))PVT 

結果

UnitNumber InsuranceID SecondaryIns 
---------- ----------- ------------ 
M7090226 UNITEDMCD NULL 
M2179062 MCD   NULL 
M2173835 MCRCAREIMP MCD 
M2165847 AMERIGROUP NULL 
M2133443 MCR   NEWERASUP 
+0

工作完美,謝謝。 – dhyman

0

加入自己並限制到你想要的類型。

SELECT v.UnitNumber, InsuranceOrderID, PrimaryIns.InsuranceID,SecIns.InsuranceID 
FROM Visits v 
INNER JOIN BarInsuranceOrder PrimaryIns 
    ON ord.VisitID=v.VisitID and InsuranceOrderID =1 
LEFT JOIN BarInsuranceOrder SecIns 
    ON ord.VisitID=v.VisitID and InsuranceOrderID =2 
+0

不得不改變它運行一點,但這正是我需要的。謝謝 – dhyman