2014-12-19 5 views
1

Мне нужно сгруппировать Customer и AlertName, чтобы узнать, сколько оповещений у каждого клиента есть, и после этого мне нужно заказать результаты по No_Alerts. Я использую этот SQL-запрос:SQL Server 2008 - упорядоченные данные по

SELECT Customer, AlertName, COUNT(AlertName) as No_Alerts 
FROM Alerts 
GROUP BY Customer, AlertName 
ORDER BY Customer, No_Alerts DESC 

Результат является:

 Customer AlertName No_Alerts 

---------------------------------- 
1 Cust1  Alert1  12 
2 Cust1  Alert7  5 
3 Cust1  Alert5  3 
4 Cust2  Alert8  32 
5 Cust2  Alert4  17 
6 Cust2  Alert2  2 
7 Cust3  Alert3  234 
8 Cust3  Alert4  22 
9 Cust3  Alert6  7 

Но как получить следующий результат, так что данные выше заказана No_Alerts?

 Customer AlertName No_Alerts 

---------------------------------- 
1 Cust3  Alert3  234 
2 Cust3  Alert4  22 
3 Cust3  Alert6   7 
4 Cust2  Alert8  32 
5 Cust2  Alert4  17 
6 Cust2  Alert2   2 
7 Cust1  Alert1  12 
8 Cust1  Alert7   5 
9 Cust1  Alert5   3 

Заранее благодарен!

ответ

3

Я думаю, что вы хотите сделать заказ на общее количество (максимальное количество) оповещений для каждого клиента. Вы можете сделать это, добавив дополнительный столбец, используя оконные функции и сортировки тем:

SELECT Customer, AlertName, COUNT(AlertName) as No_Alerts, 
     SUM(COUNT(AltertName)) OVER (PARTITION BY Customer) as TotalCustomerAlerts 
FROM Alerts 
GROUP BY Customer, AlertName 
ORDER BY TotalCustomerAlerts DESC, Customer, No_Alerts DESC; 

Обратите внимание, что order by включает в себя как общее и Customer. Это касается ситуации, когда у двух клиентов одинаковая сумма.

Если вы действительно хотите заказать заказчиком максимум, используйте MAX() вместо SUM().

Если вы не хотите видеть дополнительный столбец, используйте подзапрос или CTE.

+0

Спасибо mate - функция MAX, это то, что я искал! Сортировка! Отлично сработано! –

0

Вы можете просто добавить еще один элемент на вашей OrderBy:

SELECT Customer, AlertName, COUNT(AlertName) as No_Alerts 
FROM Alerts 
GROUP BY Customer, AlertName 
ORDER BY Customer DESC, COUNT(AlertName) DESC 

Не совсем уверен, как «No_Alerts» работал в вашем заказе, прежде чем - если вы хотите сделать заказ с помощью псевдонима столбца вы должны обернуть это в внешнем запросе как таковое:

SELECT * 
FROM (
    SELECT Customer, AlertName, COUNT(AlertName) as No_Alerts 
    FROM Alerts 
    GROUP BY Customer, AlertName 
) tableThing 
ORDER BY Customer DESC, No_Alerts DESC 
+0

бейте меня, чтобы отвечать этим точно – Pseudonym

+0

Хотя я понимаю, что вы говорите, требования OPS я чувствую это неоднозначный - его можно интерпретировать как (имя клиента DESC, COUNT DESC) или ваш маршрут. Я не думаю, что это должно быть сокращено из-за требований к интерпретации ... но хорошо. – Kritner

1

Несмотря на то, что решения, зависящие от поставщика, должны быть в гнезде SELECT.

Внешний один имеет ORDER BY, внутренний один имеет все остальное:

SELECT * FROM (SELECT ... GROUP BY ...) ORDER BY ...

Смежные вопросы