Возврат количества всех участников группы, когда поставщики входят в группу - PullRequest
2 голосов
/ 07 апреля 2020

ТАБЛИЦА 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 ошибок. Как я упоминал выше, я, вероятно, слишком обдумываю это, и решение может быть довольно простым. Извиняюсь, если информация вводит в заблуждение или я не предоставил достаточно подробностей. В реальных таблицах много личной медицинской информации, и я попытался как можно лучше перевести суть проблемы.

Спасибо.

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Вы можете использовать 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 голосов
/ 07 апреля 2020

Ваша проблема в том, что вы пропустили столбец. Вам нужно добавить имя группы, иначе вы не сможете различать строки для того же специалиста, который работает в нескольких бизнес-объектах (группах). Вероятно, поэтому у вас есть DISTINCT в вашем запросе. Вещи выглядели как дубликаты, которые не были. Как только вы это сделаете, просто используйте функцию analyti c, чтобы выяснить остальное:

SELECT ta.providerid, 
       ta.providername, 
       DECODE(tb.g_or_i, 'G', 'Group', 'I', 'Individual') AS ProviderStatus,
       ta.group_name,
       CASE
         WHEN tb.g_or_i = 'G' THEN COUNT(DISTINCT ta.provider_id) OVER (PARTITION BY ta.group_id)
         ELSE 'N/A'
       END AS GROUP_COUNT
FROM table_a ta
INNER JOIN table_b tb ON ta.providerid = tb.providerid

Возможно ли, что ваш LEFT JOIN шел в неправильном направлении? Более логично, что в вашей базовой таблице demographi c будут присутствовать все практикующие, и тогда в таблице Group могут отсутствовать некоторые записи. Например, если Solo Pra c работал под своим собственным SSN и NPI типа I без подачи заявки на отдельный NPI типа II или TIN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...