Я использую SQL Server 2008 и использую очень большой оператор CASE, который также используется в предложении GROUP By. Я хотел бы установить оператор CASE для переменной, чтобы минимизировать обслуживание кода и максимизировать повторное использование. Проблема в том, что я получаю такую ​​ошибку:

Each GROUP BY expression must contain at least one column that is not an outer reference.

Этот столбец CASED - не единственный столбец, на который есть ссылка в предложении GROUP By, поэтому я не уверен, почему я получаю эту ошибку.

Я искал на сайте, но не нашел проблемы, похожей на мою (что удивительно). Итак, как мне обойти это?

ОБНОВЛЕНИЕ: я включил тип БД. Что касается добавления кода для того, что у меня есть, я не уверен, что добавит что-нибудь, кроме большого объема, поскольку это более 200 строк. Это совсем не сложное утверждение. Он просто берет различные коды стран и сопоставляет их с их полными названиями стран. Например, в США более 50 кодов, поэтому я использую оператор CASE для их объединения. Это позволяет мне сгруппировать информацию по странам.

1
N1tr0 26 Дек 2012 в 18:44
В SQL Server вы можете заключить логику в пользовательскую функцию.
 – 
Mayo
26 Дек 2012 в 18:49
Почему вы не хотите занести коды стран в таблицу?
 – 
Zeph
26 Дек 2012 в 19:04
Я не являюсь основным администратором баз данных и на данный момент могу создавать только временные таблицы.
 – 
N1tr0
26 Дек 2012 в 19:32
Мэйо, спасибо за предложение. К сожалению, в настоящее время у меня довольно ограниченный доступ к базе данных, и я не могу делать все, что хотел бы. Если это изменится, я обязательно изучу функцию.
 – 
N1tr0
26 Дек 2012 в 19:34

1 ответ

Лучший ответ

Лучше всего это сделать с помощью подзапроса:

select var, count(*)
from (select t.*,
             (case <nasty expressions go here>
              end) var
      from t
     ) t
group by var

Вы получаете ошибку, потому что переменные в group by являются константами. Я не уверен, почему сообщение об ошибке не яснее.

И, если вы действительно хотите включить константу в group by по какой-то причине (как мне приходилось делать), тогда помогает столбец:

group by (case when coalesce(col, '') = coalesce(col, '') then 'some constant' end)

По крайней мере, в SQL Server 2008 механизм не распознает выражение как константу.

3
Gordon Linoff 26 Дек 2012 в 18:50
Спасибо! Я попробую это сделать и сообщу вам о результатах.
 – 
N1tr0
26 Дек 2012 в 18:58
Гордон, это работает и определенно сильно сокращает мой код. Спасибо! В какой-то момент в будущем я надеюсь создать функцию или что-то, что я смогу повторно использовать в глобальном масштабе, чтобы мне не приходилось постоянно копировать и вставлять этот код для каждого из моих скриптов.
 – 
N1tr0
26 Дек 2012 в 19:36
. . . Если логика case основана на одной таблице, вас могут заинтересовать вычисляемые столбцы (msdn.microsoft.com/en-us/library/ms191250 (v = sql.105) .aspx). В качестве альтернативы создайте представление и используйте его во всей своей логике.
 – 
Gordon Linoff
26 Дек 2012 в 19:50
Спасибо, Гордон! Мне придется изучить эти альтернативы.
 – 
N1tr0
27 Дек 2012 в 21:19