ТАБЛИЦА A: Предварительно присоединенная таблица - содержит список поставщиков, принадлежащих к группе, и группу, к которой принадлежит поставщик. Столбцы выглядят примерно так:
ProviderID (PK, FK) | ProviderName | GroupID | GroupName
1234 | LocalDoctor | 987 | LocalDoctorsUnited
5678 | Physican82 | 987 | LocalDoctorsUnited
9012 | Dentist13 | 153 | DentistryToday
0506 | EyeSpecial | 759 | OphtaSpecialist
ТАБЛИЦА B: Другая предварительно объединенная таблица содержит список поставщиков и их демографическую информацию c. Столбцы как таковые:
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. Я чувствую, что, возможно, переосмыслил это и застрял в oop ошибок. Вот некоторые вещи, которые я пробовал:
Добавить второе ЗАЯВЛЕНИЕ О СЛУЧАЕ:
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 ошибок. Как я упоминал выше, я, вероятно, слишком обдумываю это, и решение может быть довольно простым. Извиняюсь, если информация вводит в заблуждение или я не предоставил достаточно подробностей. В реальных таблицах много личной медицинской информации, и я попытался как можно лучше перевести суть проблемы.
Спасибо.