表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错误。正如我上面提到的,我可能想得太多,解决方案可能非常简单。如果信息令人困惑或我没有提供足够的细节,我们深表歉意。真正的桌子上有很多私人医疗信息,我尽力翻译了问题的实质。
谢谢。
您可以如下使用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
中的数据类型相同)>
您的问题似乎是您缺少一列。您需要添加组名,否则,您将无法区分在多个业务实体(组)下工作的同一从业者的行。这可能就是为什么您的查询具有DISTINCT的原因。事情看起来像重复的,不是。完成此操作后,只需使用解析函数即可找出其余的内容: