Я работаю с SQL Server большую часть десятилетия, и эта группировка (или разбиение, или ранжирование ... Я не уверен, что ответ!) Один озадачил меня. Чувствуется, что это тоже должно быть легко. Я обобщу мою проблему:
Допустим, у меня есть 3 сотрудника (не беспокойтесь о том, что они уволятся или что-то в этом роде ... всегда есть 3), и я следую за тем, как я распределяю их зарплаты ежемесячно.
Month Employee PercentOfTotal
--------------------------------
1 Alice 25%
1 Barbara 65%
1 Claire 10%
2 Alice 25%
2 Barbara 50%
2 Claire 25%
3 Alice 25%
3 Barbara 65%
3 Claire 10%
Как видите, я заплатил им одинаковый процент в 1 и 3 месяцы, но во 2 месяце я дал Алисе те же 25%, но Барбара получила 50%, а Клэр получила 25%.
То, что я хочу знать, это все отличные дистрибутивы, которые я когда-либо давал. В этом случае их будет два - один для месяцев 1 и 3 и один для месяца 2.
Я ожидаю, что результаты будут выглядеть примерно так (ПРИМЕЧАНИЕ: идентификатор, или секвенсор, или что-то еще, не имеет значения)
ID Employee PercentOfTotal
--------------------------------
X Alice 25%
X Barbara 65%
X Claire 10%
Y Alice 25%
Y Barbara 50%
Y Claire 25%
Кажется, легко, верно? Я в тупике! У кого-нибудь есть элегантное решение? Я просто собрал это решение во время написания этого вопроса, который, кажется, работает, но мне интересно, есть ли лучший способ. Или, может быть, другим способом, из которого я чему-то научусь.
WITH temp_ids (Month)
AS
(
SELECT DISTINCT MIN(Month)
FROM employees_paid
GROUP BY PercentOfTotal
)
SELECT EMP.Month, EMP.Employee, EMP.PercentOfTotal
FROM employees_paid EMP
JOIN temp_ids IDS ON EMP.Month = IDS.Month
GROUP BY EMP.Month, EMP.Employee, EMP.PercentOfTotal
Спасибо вам всем!
-Ricky