2016-10-19 4 views
0

Ich habe eine Zuordnung in Datenbank-Management-Systeme, in denen ich Abfragen für bestimmte Probleme schreiben muss. Ich habe 4 Probleme, von denen ich 3 gelöst und mit dem letzten festgefahren bin.SQLite - Rückgabe 0 wenn null

Details:

  • Mit Version 1.4 der Chinook-Datenbank (https://chinookdatabase.codeplex.com/).
  • SQLite DB Browser
  • Chinook Sqlite AutoIncrementPKs.sqlite Datei im Verzeichnis mit Chinook-Dateien ist die Datenbank arbeite ich auf

Problem Statement: eine Abfrage um eine Rangliste von Mitarbeitern basierend auf dem Geldbetrag zu erstellen, der über Kundenrechnungen eingeführt wurde, für die sie der Support-Vertreter war. Die Ergebnismenge (siehe Abbildung unten) sollte folgende Felder (in der angegebenen Reihenfolge) für alle Mitarbeiter enthalten (auch solche, die keine Kunden unterstützt haben): ID (e_id), Vorname (e_vorname), Nachname (e_last_name), Titel (e_title) und Rechnungssumme (total_invoices). Die Zeilen sollten nach Rechnungssumme (zuerst), dann nach Nachname (alphabetisch) und dann nach Vornamen (alphabetisch) sortiert werden. Der Rechnungssumme sollte ein Dollarzeichen ($) vorangestellt werden und zwei Nachkommastellen haben (gegebenenfalls gerundet); Im Fall von Mitarbeitern ohne Rechnungen sollten Sie einen Wert von 0.00 ausgeben, nicht NULL. Es kann nützlich sein, die Funktionen IFNULL, ROUND und PRINTF von SQLite zu betrachten.

gewünschte Ausgabe:

enter image description here

Meine Suche:

Select Employee.EmployeeId as e_id, 
      Employee.FirstName as e_first_name, 
      Employee.LastName as e_last_name, 
      Employee.Title as e_title, 
      '$' || printf("%.2f", Sum(Invoice.Total)) as total_invoices 
From Invoice Inner Join Customer On Customer.CustomerId = Invoice.CustomerId 
        Inner Join Employee On Employee.EmployeeId = Customer.SupportRepId 
Group by Employee.EmployeeId 
Having Invoice.CustomerId in 
(Select Customer.CustomerId From Customer 
Where Customer.SupportRepId in 
     (Select Employee.EmployeeId From Employee Inner Join Customer On Employee.EmployeeId = Customer.SupportRepId) 
) 
order by sum(Invoice.Total) desc 

Meine Leistung:

enter image description here

Wie Sie sehen können, sind die ersten drei Zeilen korrekt, aber die späteren Zeilen werden nicht gedruckt, da die Mitarbeiter keine Rechnungen haben und daher EmployeeID null ist.

Wie drucke ich die Zeilen in diesem Zustand? Ich versuchte mit Coalesce und ifnull Funktionen, aber ich kann sie nicht zur Arbeit bekommen.

Ich würde wirklich schätzen, wenn jemand meine Abfrage ändern kann, um passende Lösungen zu erhalten. Danke!

P. S: Das ist das Schema der Chinook-Datenbank

enter image description here

Antwort

1

Oft kommt es vor, dass es einfacher ist, Subqueries zu verwenden:

SELECT EmployeeId, 
     FirstMame, 
     LastName, 
     Title, 
     (SELECT printf("...", ifnull(sum(Total), 0)) 
     FROM Invoice 
     JOIN Customer USING (CustomerId) 
     WHERE Customer.SupportRepId = Employee.EmployeeId 
     ) AS total_invoices 
FROM Employee 
ORDER BY total_invoices DESC; 

(Die innere Verknüpfung könnte mit einer Unterabfrage ersetzt werden, auch.)

Aber es ist möglich, dass Sie zeigen sollten, dass Sie über outer joins gelernt haben, die eine falsche Zeile erzeugen, die NULL-Werte enthält, wenn eine übereinstimmende Zeile nicht gefunden wird:

... 
FROM Employee 
LEFT JOIN Customer ON Employee.EmployeeId = Customer.SupportRepId 
LEFT JOIN Invoice USING (CustomerID) 
... 

Und wenn Sie ein smartass sein wollen, ersetzen ifnull(sum(...), 0) mit total(...).

+0

Vielen Dank. Es funktionierte :) – user3397557