2009-11-27 4 views
1

Я получаю ошибку, используя этот запросошибка запроса выполнения SQL Server

select dbresultsid, TestCase, BuildID, Analyzed, 
    Verdict, 
    (select count(Verdict) from results where BuildID = 'Beta1' 
      and Verdict = 'PASS') AS PASS, 
    (select count(Verdict) from results where BuildID = 'Beta1' 
      and Verdict = 'FAIL') AS FAIL, 
    (select count(Verdict) from results where BuildID = 'Beta1' 
      and Verdict = 'INCONC') AS INCONC, 
    (select count(Verdict) from results where BuildID = 'Beta1' 
      and Verdict = 'TIMEOUT') AS TIMEOUT 
from results 
where BuildID = 'Beta1'  
group by TestCase,dbresultsid 
order by Analyzed 

Это говорит

Колонка «results.BuildID» недопустим в списке выбора, потому что это не содержал либо в агрегатной функции , либо в предложении GROUP BY. '

Тот же запрос отлично работает в MYSQL. Может ли кто-нибудь помочь?

Спасибо,

+0

@ck: спасибо вы для того, чтобы украсить мой код SQL – JPro

ответ

0

Вы должны либо агрегировать ваши BuildID и проанализированные столбцы или добавьте их в группу. Также обратите внимание, что способ, которым вы сейчас это делаете, ужасно неэффективен.

Посмотрите here, как вы можете улучшить вашу производительность, делая только один просмотр таблицы вместо нескольких сотен вы собираетесь иметь

+0

Благодарим вас за предложение. Недавно я перешел с MYSQL на MSSQL, и ссылка, которую вы предоставили, была очень полезна. – JPro

+0

Вы можете посмотреть здесь http://stackoverflow.com/questions/1809225/difference-in-these-queries – JPro

1

Если вы используете Group By в запросе, вы должны добавить все столбцы, которые не являются агрегатные функции к Вашей группе По п. Поэтому добавьте BuildID в предложение Group By и все остальные столбцы без агрегатов (например, Verdict и т. Д.), И он будет работать.

Также см. GROUP BY documentation для получения дополнительной информации.

+0

, почему мне нужно добавить все столбцы в группу или заказать? это так спроектирован MSSQL-сервер? Мне не нужно добавлять это в MySQL. – JPro

+0

Да, это так. В MSSQL вы должны * сделать это, как в MySQL вам не нужно. –

+0

, пожалуйста, смотрите здесь http://stackoverflow.com/questions/1809225/difference-in-these-queries – JPro

0

Group пунктом в SQL Server позволяет столбцы, которые находятся в группе К п и в случае, если мы хотим некоторые другие столбцы, то мы должны получить доступ к ним с помощью агрегатных функций, таких как MAX, MIN и т.д.

1

Изменить код вы быть это:

select dbresultsid, TestCase, BuildID, Analyzed, 
    Verdict, 
    (select count(Verdict) from results where BuildID = 'Beta1' 
      and Verdict = 'PASS') AS PASS, 
    (select count(Verdict) from results where BuildID = 'Beta1' 
      and Verdict = 'FAIL') AS FAIL, 
    (select count(Verdict) from results where BuildID = 'Beta1' 
      and Verdict = 'INCONC') AS INCONC, 
    (select count(Verdict) from results where BuildID = 'Beta1' 
      and Verdict = 'TIMEOUT') AS TIMEOUT 
from results 
where BuildID = 'Beta1'  
group by TestCase,dbresultsid, BuildID, Analyzed 
order by Analyzed 

Хотя вы фильтруете BuildID только для одного значения, SQL Server требует, чтобы он был указан в группе по списку.

0

Группировка по группам - группируйте результаты по перечисленным полям и выполняйте некоторую агрегированную функцию (сумму, avg ...) в остальных полях. Все, что не имеет count() или avg() или sum(), должно быть в группе.

Однако, похоже, вы смешивали два разных запроса вместе. Если вам нужно несколько записей с каждым приговором для данного BuildId, запрос просто:

select BuildID, Verdict, count(*) 
group by BuildID, Verdict 

Если это не то, что вы хотите, вы должны описать то, что вы пытаетесь достичь

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