Найдите годовой МАКСИМУМ и МИНИМУМ на сотрудника, используя квартальные данные

#sql #sql-server

#sql #sql-сервер

Вопрос:

Я работаю с базой данных на SQL Server, которая содержит квартальную квоту продаж сотрудников в долларах США. Таблица, из которой я извлекаю свою информацию, содержит следующие столбцы:

  • Цитата SalesQuotaKey (PK, int, НЕ NULL)
  • Ключ сотрудника (FK, int, НЕ NULL)
  • DateKey (FK, int, НЕ NULL)
  • Календарный год (smallint, НЕ NULL)
  • Календарный квартал (tinyint, НЕ NULL)
  • Количество продажquota (деньги, НЕ NULL)
  • Дата (datetime, НЕ NULL)

Столбец, содержащий значение SalesAmountQuota, показывает квартальную квоту.

Примерные данные и ожидаемый результат для одного EmployeeID, указанные ниже Employeekey Datekey Year quarter SalesAmountquota Дата

 1   272 20101229    2010    4   28000,00    2010-12-29 00:00:00.000
11  272 20110331    2011    1   7000,00 2011-03-31 00:00:00.000
21  272 20110701    2011    3   91000,00    2011-07-01 00:00:00.000
31  272 20110929    2011    3   140000,00   2011-09-29 00:00:00.000
41  272 20111229    2011    4   70000,00    2011-12-29 00:00:00.000
54  272 20120330    2012    1   154000,00   2012-03-30 00:00:00.000
68  272 20120630    2012    2   107000,00   2012-06-30 00:00:00.000
82  272 20120928    2012    3   58000,00    2012-09-28 00:00:00.000
96  272 20121228    2012    4   263000,00   2012-12-28 00:00:00.000
113 272 20130330    2013    1   116000,00   2013-03-30 00:00:00.000
130 272 20130630    2013    2   84000,00    2013-06-30 00:00:00.000
147 272 20130929    2013    3   187000,00   2013-09-29 00:00:00.000
  

emp ключ MaxSalesQuota MinSalesquota

  272    582000,00   28000,00
  

Однако я хочу создать обзор, который показывает как самый высокий за всю историю годовой объем продаж, так и самый низкий за всю историю годовой объем продаж для каждого EmployeeID (только для лет, когда все четыре квартальные квоты содержат значение)

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

 SELECT A.EmployeeKey,
       MAX(A.SalesAmountQuota) as MaxQuota,
       Min(B.SalesAmountQuota) as MinQuota 
FROM FactSalesQuota A, FactSalesQuota B
WHERE A.SalesAmountQuota = B.SalesAmountQuota
GROUP BY A.EmployeeKey
ORDER BY A.EmployeeKey
  

Комментарии:

1. Приходите и присоединяйтесь к нам в 1992 году 🙂 Вредные привычки, от которых нужно отказаться: использование объединений в старом стиле и вредные привычки, от которых нужно отказаться: использование псевдонимов таблиц, таких как (a, b, c) или (t1, t2, t3) .

2. Покажите нам несколько примеров табличных данных и ожидаемый результат — все в виде форматированного текста, а не изображений.

3. С другой стороны, если вы хотите по годам, кажется, вам просто нужно добавить год к вашему SELECT и GROUP By . Кроме того, почему вы объединяете таблицу с самой собой в одном столбце? Это не имеет никакого смысла.

4. @Larnu Действительно, присоединение не имеет смысла, виноват. Мне не нужно это по годам, я только хочу получить самую высокую и самую низкую квоту за всю историю на сотрудника, что означает, что необходимо получить сумму 4 квартальной квоты за годы, в которые сумма была самой высокой и самой низкой за всю историю.

5. Эти примерные данные и ожидаемые результаты, о которых просил @jarlh, действительно помогут нам разобраться в этом вопросе.

Ответ №1:

Создайте производную таблицу, в которой у вас есть SUM() годовая квота для каждого сотрудника, используйте HAVING предложение, чтобы убедиться, что для каждого года есть все 4 квартала. Затем выберите максимальную и минимальную годовую квоту:

 select EmployeeKey, max(YearQuota ), min(YearQuota)
from
(
    SELECT EmployeeKey, SUM(SalesAmountQuota) as YearQuota 
    FROM FactSalesQuota
    GROUP BY EmployeeKey, CalendarYear
    HAVING count(distinct CalendarQuarter) = 4 
) dt
group by EmployeeKey
  

Комментарии:

1. Это делает работу! Большое спасибо! Кажется, я всегда забываю, что могу использовать конкретную инструкцию select при указании исходной таблицы.

2. Единственное, что нужно выяснить, это как я могу исключить годы, за которые в данных присутствуют не все четыре квартала.

3. Пропустил эту часть. Следите за обновлениями. Готово!

4. Спасибо! Почти получилось!. Добавление инструкции HAVING приводит к тому, что SQL выдает одинаковые значения как для Min, так и для Max.

5. @YH93: Запрос правильный. MIN может быть равен MAX, когда у сотрудника есть только один год с четырьмя кварталами или когда все такие годы имеют одинаковую сумму.