【问题标题】:SQL - charges and payments in same column; how to break it outSQL - 同一列中的费用和付款;如何打破它
【发布时间】:2026-01-15 21:00:02
【问题描述】:

我有一个从多个表中提取数据的 SQL 查询(我有 11 个联接)

有一个“ARTransaction”表,其中包含费用、付款、调整等,其中有一个描述交易类型的“transactionCodeID”列。

我正在尝试选择大量数据,但需要两个单独的列(上面带有 cmets 的列),一列用于收费,一列用于付款。有没有办法在不使用 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

【问题讨论】:

    标签: sql sql-server tsql group-by nested-select


    【解决方案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
    

    【讨论】:

    • 哇!我不认为将 CASE 语句放在聚合中 - 或者知道你可以这样做。谢谢!我刚刚验证了数据,它按预期工作。