【问题标题】:SQL Join same table on different condition and get countSQL在不同条件下加入同一张表并获取计数
【发布时间】:2017-12-28 15:47:56
【问题描述】:

我有一张保险索赔表。它有 ID、患者的条件、ClaimID、EmergencyDepartmentFlag(1 - ED; 0 - NonED。我需要得到结果,它给我每个条件的索赔计数和每个条件的 ED 就诊次数

+----------+-----------+----------+--------+
| MemberID | Condition | ClaimID  | EDFlag |
+----------+-----------+----------+--------+
| A123     | COPD      | 34124434 |      1 |
| A526     | COPD      | 34580304 |      0 |
| A693     | COPD      | 23723642 |      1 |
| A645     | DM        | 46534633 |      1 |
+----------+-----------+----------+--------+

预期输出

+-----------+-------------+----------+
| Condition | TotalClaims | EDClaims |
+-----------+-------------+----------+
| COPD      |           3 |        2 |
| DM        |           1 |        1 |
+-----------+-------------+----------+

查询

SELECT condition, 
       Count(a1.claimid) AS TotalClaims, 
       Count(a2.claimid) AS EDClaims 
FROM   (SELECT memberid, 
               condition, 
               claimid 
        FROM   mytable) a1 
       INNER JOIN (SELECT memberid, 
                          condition, 
                          claimid 
                   FROM   mytable 
                   WHERE  edflag = 1) a2 
               ON a1.memberid = A2.memberid 
GROUP  BY condition 

这个查询没有返回正确的结果。

【问题讨论】:

  • 你为什么需要JOIN?对我来说,这似乎是一个简单的聚合,带有COUNTSUM
  • @PM77-1 你是对的

标签: sql sql-server join inner-join


【解决方案1】:

就用这个

SELECT
    Condition,
    TotalClaims = COUNT(1),
    EDClaims = SUM(CAST(EDFlag AS INT))
    FROM YourTable
    GROUP BY Condition

演示:

DECLARE @T TABLE
(
    Condition VARCHAR(50),
    ClaimID BIGINT,
    EDFlag BIT
)

INSERT INTO @T
VALUES('COPD',34124434,1),
('COPD',34580304,0),
('COPD',23723642,1),
('DM',46534633,1)

SELECT
    Condition,
    TotalClaims = COUNT(1),
    EDClaims = SUM(CAST(EDFlag AS INT))
    FROM @T
    GROUP BY Condition

结果

【讨论】:

  • 如果有另一列是Claim ID 的粒度怎么办。即 ClaimID 重复,例如:ClaimA 的 ClaimLine 编号为 1,ClaimA 的 ClaimLineNumber 为 2。所以这是两条记录。如何在查询中处理。
  • 然后它将每行单独计算。 IE;如果 ClaimA 有 Line1 和 Line2 那么,你会得到计数为 2
【解决方案2】:
SELECT 
Condition,
COUNT(*) AS TotalClaims,
SUM(CASE WHEN EDFlag = 1 THEN 1 ELSE 0 END) AS EDClaims
FROM mytable
GROUP BY Condition

【讨论】:

    猜你喜欢
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多