#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, когда у сотрудника есть только один год с четырьмя кварталами или когда все такие годы имеют одинаковую сумму.