2017-03-19 4 views
1

Ich bin mit der WideWorldImporters-Datenbank beschäftigt Microsoft gibt für Leute, die SQL lernen (versucht, besser zu werden, da ich oft SQL bei der Arbeit mache). Ich versuche, die Summe aller Verkäufe von Staat im Jahr 2013 zu erhalten.SQL zeigt alle Zeilen an, auch wenn keine übereinstimmenden Kriterien vorhanden sind

Ich habe das zusammen gut, aber das Problem ist, gibt es mehrere Staaten, die keine aufgeführt haben, und nicht auftauchen In der Liste. Wie kann ich sie erscheinen lassen und nur eine 0 für ihre Verkäufe haben? Von dem, was ich gefunden habe, hat dies mit JOINs zu tun, aber ich habe mit den verschiedenen Typen herumgespielt, und es scheint nicht den Trick zu machen. Wie Sie sehen können, habe ich auch einen CASE ausprobiert, der auch nicht geholfen hat. Irgendwelche Tipps würden sehr geschätzt werden!

SELECT 
    StateProvinceName, 
    CASE WHEN SUM(Quantity * UnitPrice) IS NULL 
     THEN '0' ELSE SUM(Quantity * UnitPrice) * (AVG(TaxRate)/100 + 1) END AS Sales 
FROM 
    Application.StateProvinces 

    FULL JOIN Application.Cities 
     ON Application.StateProvinces.StateProvinceID = Application.Cities.StateProvinceID 
    FULL JOIN Sales.Customers 
     ON Application.Cities.CityID = Sales.Customers.DeliveryCityID 
    FULL JOIN Sales.Orders 
     ON Sales.Customers.CustomerID = Sales.Orders.CustomerID 
    FULL JOIN Sales.OrderLines 
     ON Sales.Orders.OrderID = Sales.OrderLines.OrderID 

WHERE OrderDate >= '2013-01-01' 
AND OrderDate < '2014-01-01' 

GROUP BY StateProvinceName 
ORDER BY Sales DESC 

Wie Sie sehen können, die Verkaufsmengen aus den Zustandsnamen entfernt viele Tabellen sind, weiß ich nicht, ob das das Problem erschwert.

Antwort

1

Wenn Sie etwas zu where-Teil hinzufügen, bewirkt dies, dass diese Tabelle mit dem Rest der Abfrage verknüpft wird, und ich nehme an, dass dies Ihr Problem ist. Unter der Annahme, die Daten in Orders Tabelle sind, funktioniert das besser:

FROM Application.StateProvinces 
FULL JOIN Application.Cities 
    ON Application.StateProvinces.StateProvinceID = Application.Cities.StateProvinceID 
FULL JOIN Sales.Customers 
    ON Application.Cities.CityID = Sales.Customers.DeliveryCityID 
FULL JOIN Sales.Orders 
    ON Sales.Customers.CustomerID = Sales.Orders.CustomerID 
    and OrderDate >= '2013-01-01' AND OrderDate < '2014-01-01' 
FULL JOIN Sales.OrderLines 
    ON Sales.Orders.OrderID = Sales.OrderLines.OrderID 

Sie auch YYYYMMDD Datumsformat stattdessen verwenden sollten, können andere falsch interpretiert werden, finden Sie in diesem question.

+0

Das hat es gelohnt danke! – user3066571

0

Sie können auch eine LEFT JOIN in dieser Situation suchen. A Full Join gibt Ihnen alle Datensätze aus Tabellen auf beiden Seiten Ihrer Verknüpfung, wenn eine Übereinstimmung in beiden Tabellen vorhanden ist oder nicht. Dies würde Ihnen Städte, Bestellungen, Kunden und Auftragspositionen geben, die keinen übereinstimmenden Datensatz in Application.StateProvinces haben.

Wenn Sie FULL JOIN anstelle von LEFT JOIN verwenden, geben Sie in der Spalte StateProvinceName Nullwerte zurück.

Verwandte Themen