синтаксическая ошибка в обозревателе данных

Обозреватель данных Stack Exchange позволяет выполнять запросы SQL к базе данных Stack Exchange. Я попробовал это —

select
  month(CreationDate) month,
  year(CreationDate) year,
  sum(lower(left(Title,2))='wh')/count(*) wh,
  (select sum(Score)/count(*)
   from Posts u
   where month(CreationDate)=month(t.CreationDate)
     and year(CreationDate)=year(t.CreationDate)
     and lower(left(Title,2))='wh'
     and PostTypeId=1 -- question
  ) wh_score,
  sum(Score)/count(*) score,
  (select sum(AnswerCount)/count(*)
   from Posts u
   where month(CreationDate)=month(t.CreationDate)
     and year(CreationDate)=year(t.CreationDate)
     and lower(left(Title,2))='wh'
     and PostTypeId=1 -- question
  ) wh_answers,
  sum(AnswerCount)/count(*) answers
from Posts t
where PostTypeId=1 -- question
group by month,year;

— но сайт сказал мне

Неправильный синтаксис рядом с ')'. Неверный синтаксис рядом с «wh_score». Неверный синтаксис рядом с «wh_answers».

и я не могу понять, почему. Кто-нибудь может помочь, пожалуйста?


Вещи, которые я пробовал, безрезультатно:

  • datepart(month,CreationDate) вместо month(CreationDate) (и аналогично для year)
  • явный as для псевдонимов (тогда последние две из трех ошибок жаловались на 'at', а не на псевдонимы)
  • псевдонимы, которые не являются встроенными именами функций
  • left(Title,2) вместо lower(left(Title,2))
  • заключая в скобки первые два и два последних из четырех элементов, соединенных ands
  • явный u. для имен столбцов в подзапросах

person msh210    schedule 18.04.2013    source источник
comment
Последующие действия: теперь это находится по адресу data.stackexchange.com/jewish%20life% 20and%20обучение/запрос/   -  person msh210    schedule 18.04.2013
comment
Дополнительный вопрос.   -  person msh210    schedule 18.04.2013


Ответы (1)


  1. Нельзя группировать по псевдониму, нужно указать вычисляемый столбец
  2. Это запрещено : sum(lower(left(Title,2))='wh'). Вы должны преобразовать его в оператор CASE WHEN.

Вот исправленный запрос (который дает тайм-аут):

select
    month(CreationDate) month
  , year(CreationDate) year
  , sum(case when lower(left(Title,2))='wh' then 1 else 0 end)/count(*) wh
  , (select sum(Score)/count(*)
   from Posts u
   where month(CreationDate)=month(t.CreationDate)
     and year(CreationDate)=year(t.CreationDate)
     and lower(left(Title,2))='wh'
     and PostTypeId=1 -- question
  ) wh_score,
  sum(Score)/count(*) score,
  (select sum(AnswerCount)/count(*)
   from Posts u
   where month(CreationDate)=month(t.CreationDate)
     and year(CreationDate)=year(t.CreationDate)
     and lower(left(Title,2))='wh'
     and PostTypeId=1 -- question
  ) wh_answers,
  sum(AnswerCount)/count(*) answers
from Posts t
where PostTypeId=1 -- question
group by month(CreationDate), year(CreationDate);

Что вы пытаетесь сделать с этим запросом?

person Cyril Gandon    schedule 18.04.2013
comment
Благодарю вас! +1. Теперь это работает. (И у меня нет времени ожидания, но я делаю это для небольшого сайта SE.) Но он обрабатывает (или, по крайней мере, отображает) каждый столбец в результате как целое число, поэтому wh проходит (конечно) как всегда 0. Вы знаете какой-нибудь способ обойти это? (Конечно, я могу спросить об этом отдельно.) - person msh210; 18.04.2013
comment
Задайте в отдельном вопросе. Я не понимаю, что вы пытаетесь сделать с этим запросом, поэтому я не могу вам больше помочь. - person Cyril Gandon; 18.04.2013
comment
Хорошо, сделаю. (Я пытаюсь определить, являются ли wh- вопросы «лучше», чем другие вопросы: в частности, есть ли у них больше ответов или нетто голосов.) - person msh210; 18.04.2013