Подсчет и AVG в одном SQL запросе - PullRequest
0 голосов
/ 28 февраля 2020

Я прорабатываю курс по проектированию баз данных. Я на вопрос, где он хочет, чтобы я сделал запрос, который принимает количество участников, которые go набирают по вызову в месяц, и отображает среднее значение этого числа в месяц. Даты представлены в формате даты / времени, поэтому я использовал datepart, чтобы получить месяц только как запрошенный вопрос. Я поставлен в тупик в той части, где он хочет, чтобы я подсчитал, а затем усреднил его за месяц. Я довольно новичок в SQL, и хотя у меня не было слишком много проблем, эта проблема ставит меня в тупик. Мы используем MS Access, и это то, что я имею до сих пор.

SELECT
  DatePart("m",[Dispatch Date/Time]) AS [Month],
  Count([Responding Members].[Member ID]) AS [CountOfMember ID]
FROM [Responding Members]
INNER JOIN Calls ON [Responding Members].[Alarm #] = Calls.[Alarm #]
GROUP BY DatePart("m",[Dispatch Date/Time]);

Я не уверен, как написать его так, чтобы он мог выполнять обе задачи. Книга очень скучна по деталям. Любая помощь будет принята с благодарностью.

Пример:

[Calls]

[Alarm #] | [Dispatch Date/Time]
----------+---------------------
1         | 2020-01-01 10:00
2         | 2020-01-05 11:30
3         | 2020-02-02 15:50
[Responding Members]

[Alarm #] | [Member ID]
----------+------------
1         | 100
1         | 200
2         | 100
2         | 200
2         | 300
3         | 100
3         | 200
Expected result:

Month   | Calls | Avg members per call
--------+-------+---------------------
2020-01 | 2     | 2.5
2020-02 | 1     | 2

1 Ответ

0 голосов
/ 28 февраля 2020

Рассмотрим:

Запрос1: Количество членов

SELECT Format([DispatchDateTime],"yyyymm") AS YrMo, AlarmNumFK, Count(MemberID) AS CntMembers
FROM RespondingMembers INNER JOIN Calls ON RespondingMembers.AlarmNumFK = Calls.AlarmNum
GROUP BY Format([DispatchDateTime],"yyyymm"), AlarmNumFK;

Запрос2: Количество подсчетов

SELECT Format([DispatchDateTime],"yyyymm") AS YrMo, Count(Calls.AlarmNum) AS CntAlarms
FROM Calls
GROUP BY Format([DispatchDateTime],"yyyymm");

Запрос3:

SELECT CountMembers.YrMo, CntAlarms, Avg(CountMembers.CntMembers) AS AvgOfCntMembers
FROM CountAlarms INNER JOIN CountMembers ON CountAlarms.YrMo = CountMembers.YrMo
GROUP BY CountMembers.YrMo, CountAlarms.CntAlarms;

Все в одном:

SELECT CountMembers.YrMo, CntAlarms, Avg(CntMembers) AS AvgOfCntMembers
FROM 
    (SELECT Format([DispatchDateTime],"yyyymm") AS YrMo, Count(AlarmNum) AS CntAlarms
     FROM Calls
     GROUP BY Format([DispatchDateTime],"yyyymm")) AS CountAlarms 
INNER JOIN 
    (SELECT Format([DispatchDateTime],"yyyymm") AS YrMo, AlarmNumFK, Count(MemberID) AS CntMembers
     FROM RespondingMembers INNER JOIN Calls ON RespondingMembers.AlarmNumFK = Calls.AlarmNum
     GROUP BY Format([DispatchDateTime],"yyyymm"), AlarmNumFK) AS CountMembers 
ON CountAlarms.YrMo = CountMembers.YrMo
GROUP BY CountMembers.YrMo, CountAlarms.CntAlarms;

Обратите внимание, что я не использовал ни пробелы, ни знаки препинания / специальные символы в соглашении об именах.

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