2016-09-02 2 views
-2

Я пытаюсь построить запрос T-SQL для отображения некоторых столбцов и значений групп с определенными критериями под другим именем.GROUP BY с предложением WHERE в SQL Server

Это то, что у меня есть в моей таблице:

Category | Verdict  | Requests 
-----------|--------------|---------- 
Category1 | Allowed  | 1000 
Category2 | denied_now | 100 
Category2 | denied_later | 101 
Category3 | Allowed  | 203 

Я хотел закончить с результатом, как это.

Category | Verdict  | Requests 
-----------|--------------|---------- 
Category1 | Allowed  | 1000 
Category2 | denied_all | 201 
Category3 | Allowed  | 203 

Я попытался SELECT в сочетании с GROUP BY и HAVING, но я всегда получаю сообщение об ошибке. Как объединить эти значения в новую строку под новым именем для Verdict = denied%?

+1

, что ваша логика? Почему категория 4 неожиданно появляется? Какова ваша попытка? Какая у вас ошибка? – techspider

+0

Пожалуйста, разместите вашу попытку. Из вашего опубликованного стола и результатов невозможно узнать, что вам нужно. Похоже, если это простой 'select *' с условием 'where', поэтому вы должны что-то упускать, кроме того, что прокомментировал techspider. – Andrew

ответ

1

Я думаю, что это следует сделать трюк:

SELECT Category, CASE WHEN Verdict LIKE 'denied%' THEN 'denied_all' ELSE Verdict END AS Verdict, SUM(Requests) Requests 
FROM TableName 
GROUP BY Category, CASE WHEN Verdict LIKE 'denied%' THEN 'denied_all' ELSE Verdict END 
ORDER BY Category 

Я не вижу, что вам нужно какое-либо условие в HAVING.

Так что я здесь делаю просто заменить все «отказано%» вердикты с «denied_all», таким образом они могут быть сгруппированы, то я группа по категориям и модифицированном Вердикт, и, наконец, суммирующий значения в поле запроса , Никаких больших секретов.

Если вы не хотите повторить CASE WHEN, я думаю, вы должны идти с любой из них:

SELECT Category, Verdict, SUM(Requests) Requests 
FROM (
    SELECT Category, CASE WHEN Verdict LIKE 'denied%' THEN 'denied_all' ELSE Verdict END AS Verdict, Requests 
    FROM TableName 
) SubQ 
GROUP BY Category, Verdict 
ORDER BY Category 

Или:

;WITH SubQ AS 
(
    SELECT Category, CASE WHEN Verdict LIKE 'denied%' THEN 'denied_all' ELSE Verdict END AS Verdict, Requests 
    FROM TableName 
) 

SELECT Category, Verdict, SUM(Requests) Requests 
FROM SubQ 
GROUP BY Category, Verdict 
ORDER BY Category 
+0

не объяснено, почему это работает. GROUP BY разбивает записи, которые существуют, и поскольку оператор SELECT происходит ПОСЛЕ группы, изменение значений в инструкции SELECT не будет работать (почему это дублируется). Поскольку SQL сравнивает значения, которые он разбивает, другой, если это то, что эта логика не нарушит код. –

+0

Извините, я вас не понимаю. Первоначальный запрос имел одну небольшую ошибку, поскольку я набрал ее без какого-либо теста, но теперь исправлен, и он работает отлично. Пока что выбрано соответствие тому, что сгруппировано, оно будет работать независимо от того, было ли оно изменено. – Andrew

+0

На самом деле, я комментировал это для OP. Ваш запрос замечательный. :) –

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