Группировка по предложению работает в одной среде, но не в другой - PullRequest
2 голосов
/ 04 июня 2009

Передо мной совершенно непонятный случай. У меня есть две среды баз данных, A и B, где среда B была создана из резервной копии A. Я выполняю довольно простой запрос:

SELECT
    customers.customerName           (* varchar(100), not null *)
    ,countries.countryName           (* varchar(100), not null *)
    ,Balance = Sum(invoices.Amount)  (*        money, not null *)
FROM invoices
INNER JOIN customers
    ON customers.customerID = invoices.customerID
INNER JOIN countries
    ON countries.countryID = customers.countryID
GROUP BY
    customers.customerName
    ,countries.countryName
HAVING
    Sum(invoices.Amount) <> 0
ORDER BY
    customers.customerName

Запрос возвращает список пользователей с ненулевым балансом в счете. Результаты из среды А выглядят следующим образом:

customerName        countryName        Balance
------------        -----------        -------
A                   United States       20.0000
B                   United States       -5.0000
C                   Canada             199.9900
D                   Canada              -0.0100
E                   United States       55.5900

Результаты для среды B следующие:

customerName        countryName        Balance
------------        -----------        -------
A                   United States       10.0000
A                   United States       -5.0000
A                   United States       -1.0000
A                   United States       17.0000
A                   United States       -1.0000
B                   United States       -1.0000
B                   United States       -4.0000
C                   Canada             100.9900
C                   Canada              99.9900
...

Запрос отлично работает в среде A, но похоже, что предложение GROUP BY полностью игнорируется в среде B.

Запрос работает, как и ожидалось, когда я закомментирую Sum(invoices.Amount) из предложения SELECT и HAVING, поэтому он определенно связан с моим полем invoices.Amount.

Я создал резервную копию A и восстановил ее в B, и SqlDelta (инструмент сравнения для баз данных) показывает, что базы данных идентичны, поэтому это не проблема с данными, это должна быть проблема конфигурации - но у меня Идея, где искать.

В случае необходимости обе среды используют SQL Server 2000 на Windows Server 2003. Обе среды устанавливаются на двух отдельных серверах, отдельных экземплярах SQL Server и отдельных экземплярах Windows Server 2003.

Что может заставить сервер SQL не группировать поле invoices.Amount?

Ответы [ 3 ]

3 голосов
/ 04 июня 2009

Попробуйте этот запрос, чтобы попытаться воспроизвести проблему в более простой форме:

SELECT customerName, Count(*)
FROM customer
GROUP BY customerName
ORDER BY customerName

Попробуйте этот запрос, чтобы проверить возможность использования конечных пробелов в имени клиента в качестве причины для группировки по-другому.

SELECT customerName, Count(*)
FROM
(
SELECT '|' + customerName + '|' as customerName
FROM customer
) as sub
GROUP BY customerName
ORDER BY customerName
2 голосов
/ 04 июня 2009

Оказалось, что в запросе не было ошибок, это была проблема среды. Среда A имела SQL Server 8.0.2039, где среда B имела SQL Server 8.0.1053. Я обновил среду B с помощью последних пакетов обновлений, и теперь мой запрос работает, как и ожидалось.

Спасибо всем за ваши предложения :), но теперь у меня возникла новая проблема: кого убивать в Microsoft за это.

1 голос
/ 04 июня 2009

Что произойдет, если вы закомментируете предложение HAVING, но оставите Sum (invoices.Amount) в предложении SELECT? вы можете убедиться, что функция sum () работает?

Кроме того, вы можете проверить параметры сортировки базы данных (или параметры сортировки сервера по умолчанию); параметры сортировки могут влиять на некоторые агрегатные функции, но, разумеется, я не понимаю, почему это повлияет на результаты sum ().

...