2009-11-27 84 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 2009-11-27 13:43:42

回答

0

你要麼必須聚合列您的BuildID和已分析列或將其添加到組。 另外請注意,你現在正在做的方式是效率極其低下。

看看here你怎麼能這樣做只有一個表掃描提高你的表現,而不是幾百 你將有

+0

謝謝你的建議。我最近從MYSQL移到MSSQL,你提供的鏈接非常有用。 – JPro 2009-11-27 13:44:35

+0

你可以看看這裏 http://stackoverflow.com/questions/1809225/difference-in-these-queries – JPro 2009-11-27 14:59:06

1

如果您在查詢中使用GROUP BY,必須添加非集合函數您Group By子句中的所有列。因此,將BuildID添加到Group By子句以及所有其他沒有聚合的列(如Verdict等),它就可以工作。

另見GROUP BY documentation進一步的細節。

+0

爲什麼我需要by或order by所有列添加到組?這是MSSQL服務器設計的方式嗎?我不需要在MySQL中添加這樣的內容。 – JPro 2009-11-27 13:37:09

+0

是的,就是這樣。在MSSQL中,您必須*執行此操作,因爲在MySQL中您不需要。 – 2009-11-27 13:38:33

+0

可以請你看看這裏請 http://stackoverflow.com/questions/1809225/difference-in-these-queries – JPro 2009-11-27 14:57:55

0

集團在SQL Server子句允許其在GROUP BY子句中的情況下,我們希望一些列那麼我們就需要通過像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

組藉助於 - 基團的結果由列出的字段,並執行上的字段的其餘部分的一些聚集函數(求和,平均...)。沒有count()或avg()或sum()的所有東西都必須在group by中。

但是,它看起來像你混合兩個不同的查詢在一起。如果你需要一些與每個判決對於一個給定BuildId記錄,查詢很簡單:

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

如果這是你想要的,你應該說明你正在努力實現