2010-09-24 99 views
0

獲取此錯誤: 每個GROUP BY表達式都必須包含至少一個不是外部引用的列。SQL查詢:每個GROUP BY表達式必須包含至少一個不是外部引用的列

RowId ErrorDatetime    ErrorNum   ErrorMessage 
824 2010-09-24 08:01:42.000 9001  Account 55 not found 
823 2010-09-24 08:00:56.000 9001  Account 22222222222 not found 
822 2010-09-24 05:06:27.000 9001  Account 55 not found 
821 2010-09-24 05:05:42.000 9001  Account 22222222222 not found 

我試圖讓errormessage的,並在第一時間就發生當天,而這工作,因爲我只是做「由集團的ErrorMessage」。

但是,如果我想找到的第一個每一天:

SELECT Min(ErrorDateTime) as 'ErrorDateTime', Min(ErrorMessage) as 'ErrorMessage' 
FROM CommonError 
WHERE dbo.StripTimeFromDate(ErrorDateTime) = dbo.StripTimeFromDate(getdate()) 
    and ErrorNumber = '9001' 
GROUP BY dbo.StripTimeFromDate(getdate()), ErrorMessage 

的方便,花花公子功能(從http://bloggingabout.net/blogs/jschreuder/archive/2007/03/13/useful-t-sql-date-functions.aspx):

ALTER FUNCTION [dbo].[StripTimeFromDate] (@inputDate DATETIME) 
RETURNS DATETIME 
BEGIN 
    RETURN DATEADD(d, DATEDIFF(d, 0, @inputDate), 0) 
END 
+0

什麼版本的SQL Server您使用的是? – 2010-09-24 18:10:01

回答

2

我在有GETDATE()而不是ErrorDate 「分組依據」。 我想我在其他論壇中看到類似的問題,人們在「group by」中有字面意思。

更正爲:

GROUP BY dbo.StripTimeFromDate(ErrorDate), ErrorMessage 
2

首先,你不需要MIN (ErrorMessage)在你的SELECT中。只需選擇ErrorMessage。其次,僅限GROUP BY ErrorMessage。

SELECT Min(ErrorDateTime) as 'ErrorDateTime', ErrorMessage 
FROM CommonError 
WHERE dbo.StripTimeFromDate(ErrorDateTime) = dbo.StripTimeFromDate(getdate()) 
    and ErrorNumber = '9001' 
GROUP BY ErrorMessage 
+0

我以爲我說這是工作,但後來我說:「但是,如果我想找到每一天的第一...」 – NealWalters 2010-09-24 18:03:41

+0

我誤解了要求然後。 +1 to [OMG Ponies answer](http://stackoverflow.com/questions/3789487/sql-query-each-group-by-expression-must-contain-at-least-one-column-that-is-not/3789593#3789593)。 – 2010-09-24 18:13:04

+0

我現在看到了這個問題,我用getdate()代替了ErrorDate。 – NealWalters 2010-09-24 18:13:25

2

用途:

SELECT t.errormessage, MIN(t.errordatetime) AS dt 
    FROM COMMONERROR t 
GROUP BY t.errormessage, DATEADD(d, DATEDIFF(d, 0, t.errordatetime), 0) 

檢查在GROUP BY的參考;它沒有被捕獲,因爲MIN被應用到同一列。

假設的SQL Server 2005 +,這是更容易分析處理:

WITH base AS (
    SELECT t.*, 
      ROW_NUMBER() OVER(PARTITION BY t.errormessage, DATEADD(d, DATEDIFF(d, 0, t.errordatetime), 0) 
           ORDER BY t.errordatetime) AS rk 
    FROM dbo.COMMONERROR t) 
SELECT b.* 
    FROM base b 
WHERE b.rk = 1 
    AND b.errornumber = '9001' 
    AND DATEADD(d, DATEDIFF(d, 0, b.errordatetime), 0) = DATEADD(d, DATEDIFF(d, 0, GETDATE()), 0) 
+0

工程良好(即使當我拿出當前日期的測試)。但是,我必須承認,我已經研究了足夠多的分析來理解它。我希望堅持我的簡單查詢,並擺脫錯誤。不知道爲什麼它引用「外部參照」。 – NealWalters 2010-09-24 18:08:02

相關問題