2009-06-04 4 views
2

Ich habe eine absolut verwirrende Fall vor mir. Ich habe zwei Datenbankumgebungen, A und B, in denen Umwelt B hat aus einer Sicherung von A. erstellt Ich bin eine ziemlich einfache Abfrage ausgeführt wird:Group by Clause Arbeit in einer Umgebung, aber nicht eine andere

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 

Die Abfrage gibt eine Liste von Benutzern, die eine nicht haben Nullsaldo auf ihrer Rechnung. Die Ergebnisse aus der Umgebung A wie folgt aussehen:

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 

Die Ergebnisse auf Umwelt B sind wie folgt:

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 
... 

Abfrage über Umwelt A funktioniert gut, aber es sieht aus, als ob die GROUP BY-Klausel wird wird in Umgebung B ignoriert.

Die Abfrage funktioniert wie erwartet, wenn ich aus der SELECT- und HAVING-Klausel Sum(invoices.Amount) auskommentiere, so dass sie definitiv mit meinem Feld invoices.Amount verbunden ist.

Ich habe A gesichert und es auf B wiederhergestellt, und SqlDelta (ein Diff-Tool für Datenbanken) zeigt, dass Datenbanken identisch sind, also ist es kein Datenproblem, es muss ein Konfigurationsproblem sein - aber ich habe keine Ahnung, wo man hinschauen sollte.

Bei seiner relevant, beide Umgebungen mithilfe von SQL Server 2000 auf einem Windows Server 2003. Beide Umgebungen auf zwei separaten Servern, separate Instanzen von SQL Server und separate Instanzen von Windows Server 2003

installiert sind Was könnte dazu führen, dass SQL Server das Feld invoices.Amount nicht gruppiert?

+0

Dies ist eine Vermutung, also appologize, wenn ich Ihre Zeit verschwende; kannst du die verbindungseinstellungen überprüfen - hat einer ansi_nulls an und der andere nicht? – u07ch

+0

Ist das wirklich die ganze Frage? Ist es möglicherweise Teil einer größeren Abfrage? – RBarryYoung

+0

Welche Version von SQL Server & SP? – RBarryYoung

Antwort

2

Es stellt sich heraus, gab es keinen Fehler mit der Abfrage, es war ein Umgebungsproblem. Umgebung A hatte SQL Server 8.0.2039, wo Umgebung B über SQL Server 8.0.1053 verfügt. Ich habe Umgebung B mit den neuesten Service Packs aktualisiert, und jetzt funktioniert meine Abfrage wie erwartet.

Vielen Dank für Ihre Vorschläge alle :), aber jetzt habe ich ein neues Problem: Wer für diesen Ärger bei Microsoft zu töten.

+0

warum sie töten? SQL 2000 ist ein Stück Müll, Sie sollten Ressourcen für 2005 oder 2008 erhalten! – DForck42

+0

Durster: würde gerne! Während alles, was wir selbst entwickeln, 2005 gemacht wird, sind wir auf einige Drittanbieter angewiesen, die an 2000 gebunden sind. Nicht viel kann ich da machen :) – Juliet

3

Diese Abfrage des Problem in einer einfacheren Form zu reproduzieren, um zu versuchen:

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

Diese Abfrage anders die Möglichkeit, Leerzeichen in den Kundennamen als Grund zur Gruppe zu überprüfen.

1

Was passiert, wenn Sie die HAVING-Klausel auskommentieren, aber in der SELECT-Klausel Sum (invoices.Amount) belassen? Können Sie überprüfen, ob die Funktion sum() funktioniert?

Sie können auch Ihre Datenbanksortierung überprüfen (oder Ihre Standardserver-Sortierung); Sortierungseinstellungen können einige Aggregatfunktionen beeinflussen, aber ich sehe nicht, warum dies die Ergebnisse von sum() ändern würde.

+0

IT WORKS!Also, es ist definitiv die HAVING-Klausel, die das Problem verursacht, ansonsten ist die Standard-Sortierung zwischen den beiden Servern gleich. Ich hätte das schon früher bemerken sollen, aber es sieht so aus, als hätte Umgebung A SQL Server 8.0.2039, wo Umgebung B SQL Server 8.0.1053 hat. Sieht so aus, als ob ich einige Service Packs nicht installiert habe - ich werde das ausprobieren und sehen, was passiert. – Juliet

+0

Ha! Guter Fang bei den Versionsnummern; 8.00.2039 ist SP 4, also wird es zumindest in Ihrer zweiten Umgebung einfach anzuwenden sein. – Matt