(используя соединение) Я не содержался ни в статистической функции, ни в ошибке GROUP BY - PullRequest
3 голосов
/ 14 июля 2009

Я получаю следующую ошибку.

[Microsoft] [Драйвер ODBC SQL Server] [SQL Server] Столбец «STATS.VisitorIP» недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY.

Я использовал столбец VISITORIP в обоих списках выбора. Я использовал предложение GROUP BY в одном из них, поэтому я добавил VISITORIP к нему. Но у меня нет предложения GROUP BY в другом select, поэтому я не добавил его. Почему я получаю эту ошибку?

SELECT S.VISITORIP, S.HTTPADDRESS, S.DATEENTERED
FROM STATS S
JOIN (SELECT S1.VISITORIP, MAX(S1.DATEENTERED) FROM STATS S1 WHERE DATEENTERED BETWEEN '" & OnlineTime & "' AND '" & NOW() & "') S1
ON S.VISITORIP = S1.VISITORIP AND S.DATEENTERED = S1.DATEENTERED
WHERE S.DATEENTERED BETWEEN '" &TIME& "' AND '" & NOW() & "'
GROUP BY S.VISITORIP, S.HTTPADDRESS, S.DATEENTERED
ORDER BY S.DATEENTERED DESC  

Ответы [ 4 ]

5 голосов
/ 14 июля 2009

Вам нужен GROUP BY во вложенном подзапросе, потому что вы пытаетесь получить МАКСИМАЛЬНО ДАТАЦИРОВАННО для каждого VISITORIP.VISITORIP существует в SELECT для этого подзапроса, поэтому вам также нужно указать GROUP BY, чтобы он возвращал самую последнюю дату для каждого посетителя.

SELECT S.VISITORIP, S.HTTPADDRESS, S.DATEENTERED
FROM STATS S
JOIN (SELECT S1.VISITORIP, MAX(S1.DATEENTERED) FROM STATS S1 WHERE DATEENTERED BETWEEN '" & OnlineTime & "' AND '" & NOW() & "' GROUP BY S1.VISITORIP) S1
ON S.VISITORIP = S1.VISITORIP AND S.DATEENTERED = S1.DATEENTERED
WHERE S.DATEENTERED BETWEEN '" &TIME& "' AND '" & NOW() & "'
GROUP BY S.VISITORIP, S.HTTPADDRESS, S.DATEENTERED
ORDER BY S.DATEENTERED DESC
1 голос
/ 14 июля 2009

Вы получаете ошибку, потому что ваш подвыбор в JOIN:

SELECT S1.VISITORIP, MAX(S1.DATEENTERED) FROM STATS S1 WHERE DATEENTERED BETWEEN '" & OnlineTime & "' AND '" & NOW() & "'

Пытается объединить "DATEENTERED", но для этого необходимо сгруппироваться по "VISITORIP".

Попробуйте:

SELECT S1.VISITORIP, MAX(S1.DATEENTERED) FROM STATS S1 WHERE DATEENTERED BETWEEN '" & OnlineTime & "' AND '" & NOW() & "' GROUP BY S1.VISITORIP
1 голос
/ 14 июля 2009

Ваш Inner select использует MAX для DATEENTERED, но не включает групповую связь в VisitorIP.

SELECT S.VISITORIP, S.HTTPADDRESS, S.DATEENTERED
FROM STATS S
JOIN (SELECT S1.VISITORIP, MAX(S1.DATEENTERED)
   FROM STATS S1
   WHERE DATEENTERED BETWEEN '" & OnlineTime & "' AND '" & NOW() & "'
   GROUPBY S1.VISITORIP) S1
ON S.VISITORIP = S1.VISITORIP AND S.DATEENTERED = S1.DATEENTERED
WHERE S.DATEENTERED BETWEEN '" &TIME& "' AND '" & NOW() & "'
GROUP BY S.VISITORIP, S.HTTPADDRESS, S.DATEENTERED
ORDER BY S.DATEENTERED DESC  
1 голос
/ 14 июля 2009

Этот (вложенный запрос) недопустим:

SELECT S1.VISITORIP, MAX(S1.DATEENTERED)
FROM STATS S1 
WHERE DATEENTERED BETWEEN '" & OnlineTime & "' AND '" & NOW() & "'

Должно быть:

SELECT S1.VISITORIP, MAX(S1.DATEENTERED) AS DATEENTERED
FROM STATS S1 
WHERE DATEENTERED BETWEEN '" & OnlineTime & "' AND '" & NOW() & "'
GROUP BY S1.VISITORIP
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...