2016-06-20 4 views
0

Я получаю следующее сообщение об ошибке;Подзапрос возвратил более 1 значения, ошибка

Подзапрос возвратил более 1 значения. Это недопустимо, когда подзапрос следует =,! =, <, < =,>,> = или когда подзапрос используется как выражение.

Раздел кода, с которым у меня возникают проблемы, находится в моем заявлении выбора;

,(SELECT COUNT(sch.startdate) 
     FROM #test AS sch 
     WHERE L.Id = sch.id 
     GROUP BY sch.id, sch.startdate 
     HAVING sch.startdate >= L.T_Start AND sch.startdate <= @END) AS SC 

В настоящее время он работает, если у человека только одна запись в тестовой таблице темпа, но разваливается, когда есть два. Я знаю, что могу использовать Top 1, чтобы ограничить его, но это не то, что я хочу. L - это основной оператор select.

ИТАК таблица температуры имеет следующие данные:

ID startdate 
1 2014-10-02 
1 2014-11-02 
2 2014-11-02 

С ТОП 1 в моем коде я получаю результаты ниже:

ID ~Other Stuff~ SC 
1 ~~~~~~~~~~~~~ 1 
2 ~~~~~~~~~~~~~ 1 

Но то, что я хочу быть возвращены:

ID ~Other Stuff~ SC 
1 ~~~~~~~~~~~~~ 2 
2 ~~~~~~~~~~~~~ 1 

Как я могу изменить свой код, чтобы достичь этого?

Спасибо.

+1

Чтобы получить хороший ответ, вам все равно нужно показать «основное» предложение 'from', а не просто подзапрос. Понятно, что вы хотите избавиться от 'group by' в подзапросе и использовать для предложения' where', чтобы по существу присоединиться к основному запросу с помощью строки 'where sch.id = main.id'. – tarheel

ответ

0

Это зависит от того, что вы пытаетесь сосчитать. Также появляется (без дополнительной информации), что вы можете переместить предложение HAVING в предложение WHERE.

Если вы пытаетесь подсчитать строки из #test этого матча:

,(SELECT COUNT(*) 
    FROM #test AS sch 
    WHERE L.Id = sch.id 
    AND sch.startdate >= L.T_Start AND sch.startdate <= @END) AS SC 

Если вы пытаетесь подсчитать уникальные значения STARTDATE:

,(SELECT COUNT(DISTINCT sch.startdate) 
    FROM #test AS sch 
    WHERE L.Id = sch.id 
    AND sch.startdate >= L.T_Start AND sch.startdate <= @END) AS SC 

Если вы пытаетесь подсчитать уникальные комбинации (id, startdate), то я думаю, вам нужен еще один уровень запроса:

,(SELECT COUNT(*) FROM (
     SELECT sch.id, sch.startdate 
     FROM #test AS sch 
     WHERE L.Id = sch.id 
     AND sch.startdate >= L.T_Start AND sch.startdate <= @END 
     GROUP BY sch.id, sch.startdate) 
    AS X) AS SC 

См. COUNT (Transact-SQL)

0

Удалить sch.startdate от GROUP BY. Вы хотите считать StartDates, а не Group By.

+0

Я бы подумал, что это все GROUP BY, которое должно быть удалено, потому что это все равно будет сгруппировано L.Id then. –

+0

Это правда, что вы можете удалить всю группу By и получить желаемые результаты, но я упомянул только о начале, потому что это та часть, которая вызывает нежелательное поведение. –

0

HAVING Используется для отфильтровывания групп, где некоторые условия относятся ко всей группе. Обычно это какая-то совокупность из вашей группы, например.

HAVING sum(amount) > 10 

Вы кладете

HAVING sch.startdate >= L.T_Start --... 

который тянет L.T_start на уровне строк (так как это не совокупность, а не в вашей GROUP BY).

В зависимости от того, что вы пытаетесь сделать, либо

движение, которое в предложении WHERE (для фильтрации строк из заявления предварительной группировки)

или

делают это совокупность (например, HAVING макс (sch.startdate> L.T_start) и т.д.

или

группа по этому условию, например, Гроу p - ..., CASE when sch.startdate> L.T_start then 1 else 0 end - ... Обратите внимание, что последний вариант может дать вам две группы, поэтому вы должны также включить этот оператор CASE в качестве столбец в выбранном списке, чтобы определить разницу.

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