SELECT COUNT (*) на основе условий объединенной таблицы - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь написать запрос по отношению к образовательной системе, который возвращает числовые значения, основанные на следующих типах проверок, проведенных в определенных школах в ноябре, только я не совсем понимаю, как это сделать.

Мне нужно вернуть список организаций, на которые ссылались за несоблюдение в ноябре, а затем указать количество посещений за тот месяц, которые привели к цитированию. Мне нужен подсчет для каждого типа из условия insp.Type_of_Visit__c, основанного на каждом поставщике, но не на отдельном поставщике в случае, если им было выдано несколько несоответствий.

Мне нужно, чтобы каждый тип посещения был отдельной колонкой.

Пока что мой встроенный подзапрос возвращает нефильтрованные результаты:

SELECT ...
, (SELECT COUNT(*) FROM Inspection__c WHERE Type_of_Visit__c = 'Pre-Licensing') AS [Number of PreLicensing Statement of Non-Compliance issue date]

Это не фильтрует предложения WHERE, которые у меня есть.

Кроме того, мне нужно будет повторять эту строку для каждого типа посещения, если нет лучшего способа сделать это.

Честно говоря, я просто не понимаю, как правильно это сделать.

SELECT  a.Provider_Number__c AS [Provider ID]
, a.Provider_No__c AS [Legacy System Number]
, a.License_Status__c AS [License Status]
, a.Record_Type_Name__c AS [Record Type Name]
, a.Provider_Status__c AS [Provider Status]
, a.License_Type__c AS [License Type]
, a.Name AS [Name]
, a.Provider_Address_1__c AS [Street Address 1]
, a.Provider_Address_2__c AS [Street Address 2]
, a.Provider_city_text__c AS City
, a.Provider_Zip_Code__c AS [Zip Code]
, a.Phone
, a.Provider_Email__c AS Email
, a.Capacity__c AS [Licensed Capacity]
, insp.Date_of_Visit__c AS [Visit Date]
, inv.Statement_of_non_compliance_Issue_Date__c AS [Statement of Non-Compliance Issued Date]
    , (SELECT COUNT(*) FROM Inspection__c WHERE Type_of_Visit__c = 'Pre-Licensing') AS [Number of PreLicensing Statement of Non-Compliance issue date]

  FROM Inspection__c insp
  JOIN Account a ON a.Id = insp.Provider_No__c
  JOIN Investigation__c inv ON inv.Provider_Id__c = a.Id
  WHERE (insp.Date_of_Visit__c BETWEEN '2018-11-01' AND '2018-11-30')
  AND (a.Record_Type_Name__c = 'Large Group' OR a.Record_Type_Name__c = 'Small Group')
  AND insp.Type_of_Visit__c IN ('Pre-Licensing',
    'Provisional License 90-day Monitoring',
    'Provisional License Renewal',
    'Renewal-Monitoring',
    'Renewal-Full Review',
    'Monitoring',
    'Enhanced Monitoring',
    'Capacity Increase',
    'Change of Location',
    'Change of Space',
    'Follow-up',
    'Monitoring outside differential Licensing Cycle',
    'License Upgrade',
    'Re-Activate Provider',
    'Technical Assistance',
    'Progress',
    'Renewal-Enhanced Monitoring')

Мне нужно подсчитать каждый тип посещения для каждого провайдера и вернуть значения в таблицу. Это не обязательно должна быть функция COUNT, если есть лучший способ.

Любая помощь очень ценится. Спасибо.

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Я не собираюсь печатать все ваши строки, но я покажу вам, как это сделать.

Допустим, ваш запрос выглядит следующим образом:

SELECT A,B,C
FROM T
WHERE Z in ('x','y','z')

Где T имеет индекс index1 (в вашем случае index1, вероятно, Provider_ID)

Тогда вы можете сделать это

SELECT A,B,C, G1.x_count, G1.y_count, G1.z_count
FROM T
JOIN (
  SELECT index1,
    SUM(CASE WHEN Z = 'x' THEN 1 ELSE 0 END) AS x_COUNT,
    SUM(CASE WHEN Z = 'y' THEN 1 ELSE 0 END) AS y_COUNT,
    SUM(CASE WHEN Z = 'z' THEN 1 ELSE 0 END) AS z_COUNT
  FROM T
  WHERE Z in ('x','y','z')
  GROUP BY index1
) G1 on T.index1 = G1.index1

Итак, теперь у вас есть счетчики для x, y, z для каждого индекса1

0 голосов
/ 04 января 2019

Если вы используете MySql 8, вы можете использовать

COUNT(*) OVER (PARTITION BY Type_of_Visit)

может решить вашу проблему.

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