Регистр и количество в SQL Server 2008 - PullRequest
5 голосов
/ 29 августа 2011

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

SELECT
    State_ID,
    State_Name,
    State_All= CASE WHEN type1=1 AND type2=1 THEN COUNT(Id) END
    State_w= CASE WHEN type1=2 AND type2=1 THEN COUNT(Id) END
    State_s= CASE WHEN type1=2 AND type2=2 THEN COUNT(Id) END
FROM
    tblStates

, но я получаю эту ошибку:

Column 'State_ID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Когда я добавил предложение GROUP BY для State_ID, я снова получил ошибку выше для State_Name и при добавленииState_Name для предложения GROUP BY, я получил ошибку для State_All, State_w, State_s.

У меня нет столбца с именем State_All, State_w, State_s в моей таблице.

Как получитьрассчитывать в соответствии с конкретными условиями без использования CURSORS?

Ответы [ 4 ]

11 голосов
/ 29 августа 2011

Вы были на правильном пути.

Вы помещаете условие в СЧЕТ вот так.COUNT игнорирует NULL (что подразумевается как ELSE в CASE), поэтому вы учитываете только истинные совпадения.Вам также требуется GROUP BY.

Ваша ошибка происходит из-за использования type1 и type2 вне COUNT

SELECT
    State_ID,
    State_Name,
    State_All = COUNT(CASE WHEN type1=1 AND type2=1 THEN 1 END), 
    State_w = COUNT(CASE WHEN type1=2 AND type2=1 THEN 1 END), 
    State_s = COUNT(CASE WHEN type1=2 AND type2=2 THEN 1 END)
FROM
    tblStates
GROUP BY
    State_ID, State_Name
3 голосов
/ 04 декабря 2013

Вы можете изменить Количество на СУММА , потому что результат каждой записи 1

SELECT
    State_ID,
    State_Name,
    State_All = SUM(CASE WHEN type1=1 AND type2=1 THEN 1 END), 
    State_w = SUM(CASE WHEN type1=2 AND type2=1 THEN 1 END), 
    State_s = SUM(CASE WHEN type1=2 AND type2=2 THEN 1 END)
FROM
    tblStates
GROUP BY
    State_ID, State_Name
0 голосов
/ 29 августа 2011

Будет ли это исправить?

SELECT
   State_ID,
   State_Name,
   CASE WHEN type1=1 AND type2=1 THEN COUNT(Id) END AS State_All,
   CASE WHEN type1=2 AND type2=1 THEN COUNT(Id) END AS State_w,
   CASE WHEN type1=2 AND type2=2 THEN COUNT(Id) END AS State_s
FROM
   tblStates
GROUP BY State_ID, State_Name
0 голосов
/ 29 августа 2011

Вы должны добавить оба столбца в конце вашего запроса:

GROUP BY State_ID, State_Name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...