2016-11-21 21 views
0

我有一個是從多個表中獲取數據的SQL查詢(我有11個連接)SQL - 同一列中的收費和付款;如何打破它

有一個「ARTransaction」表中包含費用,付款,調整等,並有一個描述事務類型的「transactionCodeID」列。

我想選擇大量數據,但需要兩個單獨的列(上面有註釋的列),一個用於收費,一個用於支付。有沒有辦法實現這一點,而不使用where子句?我試圖使用嵌套的select語句,但它返回相同的值爲每一行(總金額)

我附加下面的查詢 - 在此先感謝!此外,我對數據檢索相當新,所以如果其他任何看起來不可思議的任何其他建議非常感謝。

SELECT CONVERT(varchar(10),sl.ServiceDtFrom, 101) AS 'srvdate' 
    , f.Alias AS 'svc dprtmnt' 
    , CASE WHEN pc.Alias IS NULL 
      THEN po.Name 
      ELSE pc.Description END AS 'svc dept grp' 
    , COUNT(clm.ID) AS 'clm cnt' 
    , COUNT(p.ID) AS 'ptnt count' 
    /* 1 */ 
    , SUM(ar.Amount) AS 'all chgs' --ONLY CHARGES (tt.ID IN(1,2)) 
    , SUM(sl.Units + sl.TimeUnits + sl.PhysicalStatusUnits) AS 'chg units sum' 
    /* 2 */ 
    , SUM(ar.Amount) AS 'net pmt' --ONLY PAYMENTS (tt.ID IN(3,4,9,10,11,12,20,21)) 
FROM ARTransaction ar   WITH (NOLOCK) 
LEFT JOIN ServiceLine sl  WITH (NOLOCK) 
    ON ar.ServiceLineID = sl.ID 
LEFT JOIN Incident i   WITH (NOLOCK) 
    ON sl.IncidentID = i.ID 
LEFT JOIN HealthCareFacility f WITH (NOLOCK) 
    ON i.FacilityID = f.ID 
LEFT JOIN ProvOrgFacility poc WITH (NOLOCK) 
    ON poc.FacilityID = f.ID 
LEFT JOIN ProfitCenter pc  WITH (NOLOCK) 
    ON poc.ProfitCenterID = pc.ID 
LEFT JOIN ProviderOrganization po WITH (NOLOCK) 
    ON i.ProvOrgID = po.ID 
LEFT JOIN Claim clm    WITH (NOLOCK) 
    ON i.ID = clm.IncidentID 
LEFT JOIN Person p    WITH (NOLOCK) 
    ON i.PatientID = p.ID 
LEFT JOIN TransactionCode tc WITH (NOLOCK) 
    ON ar.TransactionCodeID = tc.ID 
LEFT JOIN TransactionType tt WITH (NOLOCK) 
    ON tc.TransactionTypeID = tt.ID 

WHERE i.IsReversed <> 1 
     AND sl.ServiceDtFrom IS NOT NULL 

GROUP BY 
     sl.ServiceDtFrom, f.Alias 
    , po.Name, pc.Alias, pc.Description 

ORDER BY 1,3,2 

回答

1

您可以使用CASE語句來實現這一目標: -

SELECT CONVERT(varchar(10),sl.ServiceDtFrom, 101) AS 'srvdate' 
    , f.Alias AS 'svc dprtmnt' 
    , CASE WHEN pc.Alias IS NULL 
      THEN po.Name 
      ELSE pc.Description END AS 'svc dept grp' 
    , COUNT(clm.ID) AS 'clm cnt' 
    , COUNT(p.ID) AS 'ptnt count' 
    /* 1 */ 
    , SUM(case when tt.ID IN(1,2) then ar.Amount else 0 end) AS 'all chgs' --ONLY CHARGES (tt.ID IN(1,2)) 
    , SUM(sl.Units + sl.TimeUnits + sl.PhysicalStatusUnits) AS 'chg units sum' 
    /* 2 */ 
    , SUM(case when tt.ID IN(3,4,9,10,11,12,20,21) then ar.Amount else 0 end) AS 'net pmt' --ONLY PAYMENTS (tt.ID IN(3,4,9,10,11,12,20,21)) 
FROM ARTransaction ar   WITH (NOLOCK) 
LEFT JOIN ServiceLine sl  WITH (NOLOCK) 
    ON ar.ServiceLineID = sl.ID 
LEFT JOIN Incident i   WITH (NOLOCK) 
    ON sl.IncidentID = i.ID 
LEFT JOIN HealthCareFacility f WITH (NOLOCK) 
    ON i.FacilityID = f.ID 
LEFT JOIN ProvOrgFacility poc WITH (NOLOCK) 
    ON poc.FacilityID = f.ID 
LEFT JOIN ProfitCenter pc  WITH (NOLOCK) 
    ON poc.ProfitCenterID = pc.ID 
LEFT JOIN ProviderOrganization po WITH (NOLOCK) 
    ON i.ProvOrgID = po.ID 
LEFT JOIN Claim clm    WITH (NOLOCK) 
    ON i.ID = clm.IncidentID 
LEFT JOIN Person p    WITH (NOLOCK) 
    ON i.PatientID = p.ID 
LEFT JOIN TransactionCode tc WITH (NOLOCK) 
    ON ar.TransactionCodeID = tc.ID 
LEFT JOIN TransactionType tt WITH (NOLOCK) 
    ON tc.TransactionTypeID = tt.ID 

WHERE i.IsReversed <> 1 
     AND sl.ServiceDtFrom IS NOT NULL 

GROUP BY 
+0

哇!我沒有想到把CASE聲明放在彙總內 - 或者知道你可以做到這一點。謝謝!我只是驗證了數據,它的工作方式和預期的一樣。 –