SQL-запрос: каждое выражение GROUP BY должно содержать хотя бы один столбец, который не является внешней ссылкой - PullRequest
0 голосов
/ 24 сентября 2010

Получение этой ошибки: Каждое выражение 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»

Однако, если я хочу найти первое для каждого дня:

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 

Функция Handy-Dandy (от 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

Ответы [ 3 ]

2 голосов
/ 24 сентября 2010

Использование:

  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; его не поймали, потому что МИН применялся к тому же столбцу.

Если предположить 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)
2 голосов
/ 24 сентября 2010

У меня был метод getdate () вместо ErrorDate в «group by».Я думаю, что я видел подобные проблемы на других форумах, где люди имели буквальное значение в «группе по».

Исправление:

GROUP BY dbo.StripTimeFromDate(ErrorDate), ErrorMessage 
2 голосов
/ 24 сентября 2010

Во-первых, вам не нужно 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 
...