2016-10-12 2 views
0

Ich habe nett kleines Projekt, um die Anzahl der Sendungen pro Land unter bestimmten Büro zu berechnen. Ich ziehe eine einzelne Abfrage zu schreiben, weil es sonst für immer dauern wird unter Verwendung der Daten während/for-Schleifen usw. Aus diesem Grunde zu verarbeiten ganzen schrieb ich eine Abfrage wie folgt:Benötigen Sie Unterstützung mit Aggregat Zählfunktion

SELECT 
COUNTRY.Code, COUNTRY.Name, 
(SELECT COUNT(Shipment.Ref) FROM Shipment 
LEFT JOIN Station (NOLOCK) ON Station.STID = Shipment.STDEST 
LEFT JOIN Country (NOLOCK) ON Station.Code = Country.Code 
LEFT JOIN Client (NOLOCK) ON Client.CID = Shipment.CID 
WHERE Client.CBUR = 'UKLON' 
) AS NumOrder 
FROM COUNTRY 

Und diese Rückkehr eine Gesamtzahl von Sendungen und nicht pro bestimmtem Land

-------------------------------------- 
|Code |Name    |NumOrder| 
-------------------------------------- 
| BE  |BELGIUM   | 82460 | 
| FR  |FRANCE   | 82460 | 
| UK  |UNITED KINGDOM | 82460 | 
| NL  |NETHERLANDS  | 82460 | 
| AZ  |AZERBAIJAN  | 82460 | 
| HK  |HONG KONG   | 82460 | 
| AU  |AUSTRALIA   | 82460 | 
| RE  |REUNION ISLAND | 82460 | 

ich wirklich, wenn jemand schätze einen Hinweis geben würde mir, wie die vorhandene Abfrage ändern jene Sendung pro Land in der Lage sein zu zählen auf der Grundlage des gegebenen Checkkonto.

+0

Wie Office-Konto gespeichert ist? – qxg

+1

Was ist TPAY.Code? –

+0

Sie müssen auf jeden Fall "GROUP BY", aber da ich nicht Ihre gesamte Datenbank sehen kann, ist es nicht einfach zu sagen, um welches Feld. Versuchen Sie zum Beispiel nach Ländercode zu gruppieren. –

Antwort

0

versuchen, das Land in dem Grafen

SELECT 
COUNTRY.Code, COUNTRY.Name, 
(SELECT COUNT(Shipment.Ref) FROM Shipment 
LEFT JOIN Station (NOLOCK) ON Station.STID = Shipment.STDEST 
LEFT JOIN Country (NOLOCK) ON Station.Code = TPAY.Code 
LEFT JOIN Client (NOLOCK) ON Client.CID = Shipment.CID 
WHERE Client.CBUR = 'UKLON' and Country.Name = C.Name --or this "and Country.Code = C.Code" 
) AS NumOrder 
FROM COUNTRY C 
+0

Danke Aleksandar, deine Lösung funktioniert absolut perfekt! – piotr

+0

Gern geschehen. –

0

Ändern Sie es an:

SELECT 
    C.Code, C.Name, 
    (
     SELECT COUNT(Shipment.Ref) FROM Shipment 
     LEFT JOIN Station (NOLOCK) ON Station.STID = Shipment.STDEST 
     LEFT JOIN Client (NOLOCK) ON Client.CID = Shipment.CID 
     WHERE Client.CBUR = 'UKLON' AND Station.Code=C.Code 
    ) AS NumOrder 
FROM COUNTRY C 

OR Usegroup Von:

SELECT 
    C.Code, C.Name, 
    COUNT(Shipment.Ref) AS NumOrder 
FROM Shipment 
LEFT JOIN Station (NOLOCK) ON Station.STID = Shipment.STDEST 
LEFT JOIN Client (NOLOCK) ON Client.CID = Shipment.CID 
LEFT JOIN COUNTRY C ON Station.Code=C.Code 
WHERE Client.CBUR = 'UKLON' 
GROUP BY C.Code 
+0

Die 'GROUP BY'-Abfrage würde jedoch nur Länder für 'UKLON' erhalten und sollte auch' C.Name, 'in der' GROUP BY'-Klausel für SQL Server enthalten. –

0

Smth hinzufügen. wie diese, sollten in einer Anfrage, group by-Klausel:

SELECT 
COUNTRY.Code, COUNTRY.Name, COUNT(Shipment.Ref) 
FROM Country 
-- joins go here: Shipment etc. 
GROUP BY COUNTRY.Code, COUNTRY.Name 
0

sind meine Annahmen sind:

  • STID ist Primärschlüssel der Station entfernt.
  • CID ist der Primärschlüssel des Clients.
  • TPAY soll Land sein.
  • Code ist der Primärschlüssel des Landes.

Also Ihre linken Joins geben sowieso einen Datensatz zurück (der passende oder ein Dummy leer). Outer-Joins ergeben in Ihrer Abfrage keinen Sinn.

Sie korrelieren Ihre Unterabfrage nicht mit Ihrer Hauptabfrage, d. H. Sie wählen keine Datensätze innerhalb des Landes ohne. Sie müssten dies Ihrer WHERE-Klausel in Ihrer Unterabfrage hinzufügen.

SELECT 
    COUNTRY.Code, 
    COUNTRY.Name, 
    (
    SELECT COUNT(*) 
    FROM Shipment 
    JOIN Station ON Station.STID = Shipment.STDEST 
    WHERE Station.Code = COUNTRY.Code 
    AND Shipment.CID IN (SELECT CID FROM Client WHERE CBUR = 'UKLON') 
) AS NumOrder 
FROM COUNTRY; 

Und hier ist die gleiche Sache mit der Unterabfrage in der FROM-Klausel statt:

SELECT 
    COUNTRY.Code, 
    COUNTRY.Name, 
    counted.NumOrder 
FROM COUNTRY 
JOIN 
(
    SELECT Station.Code, COUNT(*) AS NumOrder 
    FROM Station 
    JOIN Shipment ON Shipment.STDEST = Station.STID 
       AND Shipment.CID IN (SELECT CID FROM Client WHERE CBUR = 'UKLON') 
    GROUP BY Station.Code 
) counted ON counted.Code = COUNTRY.Code; 
Verwandte Themen