当提供者成为组的一部分时,组成员总数的返回计数

问题描述 投票:2回答:2

表A:预联接表-包含属于一个组的提供商列表以及该提供商所属的组。列是这样的:

ProviderID (PK, FK) | ProviderName | GroupID | GroupName 

 1234               | LocalDoctor  | 987     | LocalDoctorsUnited
 5678               | Physican82   | 987     | LocalDoctorsUnited
 9012               | Dentist13    | 153     | DentistryToday
 0506               | EyeSpecial   | 759     | OphtaSpecialist

表B:另一个预先连接的表,包含提供程序及其人口统计信息的列表。这样的列:

ProviderID (PK,FK)  | ProviderName  | G_or_I | OtherColumnsThatArentInUse

 1234               | LocalDoctor  | G       | Etc.
 5678               | Physican82   | G       | Etc.
 9012               | Dentist13    | I       | Etc.
 0506               | EyeSpecial   | I       | Etc.

预期结果是这样的:

 ProviderID         | ProviderName | ProviderStatus | GroupCount

 1234               | LocalDoctor  | Group          | 2
 5678               | Physican82   | Group          | 2
 9012               | Dentist13    | Individual     | N/A
 0506               | EyeSpecial   | Individual     | N/A

目标是通过G_or_I列来确定提供者是否属于某个组或单独运营。如果提供者属于一个组,那么我需要添加一个额外的列,以提供该组中提供者的总数。

组/个人部分相对容易-我做了这样的事情:

SELECT DISTINCT
 A.ProviderID,
 A.ProviderName,
 CASE
  WHEN B.G_or_I = 'G'
   THEN 'Group'
  WHEN B.G_or_I = 'I'
   THEN 'Individual' END AS ProviderStatus
FROM
 TableA A
  LEFT OUTER JOIN TableB B
   ON A.ProviderID = B.ProviderID;

到目前为止,到目前为止,它根据G_or_I标志返回了预期的结果。

但是,我似乎无法全神贯注于如何完成COUNT部分。我觉得我可能想得太多,陷入了错误循环。我尝试过的一些事情:

添加第二个案例声明:

CASE
 WHEN B.G_or_I = 'G'
  THEN (
        SELECT CountedGroups 
        FROM (
               SELECT ProviderID, count(GroupID) AS CountedGroups 
               FROM TableA
               WHERE A.ProviderID = B.ProviderID
               GROUP BY ProviderID --originally had this as ORDER BY, but that was a mis-type on my part
             )
       )
  ELSE 'N/A' END

这将返回错误,指出单行子查询将返回多个行。如果将返回的行数限制为1,则CountedGroups列的每一行都会返回1。这使我认为它没有像我期望的那样执行计数功能。

我还尝试过将TableA的直接计数作为分解的子查询:

WITH CountedGroups AS
( SELECT Provider ID, count(GroupID) As GroupSum
  FROM TableA
  GROUP BY ProviderID --originally had this as ORDER BY, but that was a mis-type on my part
) --This as a standalone query works just fine

  SELECT DISTINCT
     A.ProviderID,
     A.ProviderName,
     CASE
      WHEN B.G_or_I = 'G'
       THEN 'Group'
      WHEN B.G_or_I = 'I'
       THEN 'Individual' END AS ProviderStatus,
    CASE
      WHEN B.G_or_I = 'G'
       THEN GroupSum
      ELSE 'N/A' END
    FROM
     CountedGroups CG
      JOIN TableA A
       ON CG.ProviderID = A.ProviderID
      LEFT OUTER JOIN TableB
       ON A.ProviderID = B.ProviderID

这将返回空值或完全不正确的列值

[其他尝试是这种方法的许多变体,包括不良结果或Oracle错误。正如我上面提到的,我可能想得太多,解决方案可能非常简单。如果信息令人困惑或我没有提供足够的细节,我们深表歉意。真正的桌子上有很多私人医疗信息,我尽力翻译了问题的实质。

谢谢。

sql oracle join count
2个回答
1
投票

您可以如下使用CASE..WHEN和分析函数COUNT

SELECT
    A.PROVIDERID,
    A.PROVIDERNAME,
    CASE
        WHEN B.G_OR_I = 'G' THEN 'Group'
        ELSE 'Individual'
    END AS PROVIDERSTATUS,
    CASE
        WHEN B.G_OR_I = 'G' THEN TO_CHAR(COUNT(1) OVER(
            PARTITION BY A.GROUPID
        ))
        ELSE 'N/A'
    END AS GROUPCOUNT
FROM
    TABLE_A A
    JOIN TABLE_B B ON A.PROVIDERID = B.PROVIDERID;

TO_CHAR上需要[COUNT,因为输出表达式必须与CASE..WHEN中的数据类型相同)>


0
投票

您的问题似乎是您缺少一列。您需要添加组名,否则,您将无法区分在多个业务实体(组)下工作的同一从业者的行。这可能就是为什么您的查询具有DISTINCT的原因。事情看起来像重复的,不是。完成此操作后,只需使用解析函数即可找出其余的内容:

© www.soinside.com 2019 - 2024. All rights reserved.