2017-11-28 3 views
1

Ich habe die folgende Abfrage, die eine View-Tabelle die höchsten Verkäufer in einem Geschäft mit einigen anderen Details schafft zeigt:MySQL - Wie ein Ergebnis pro ID begrenzen?

wird die Verkaufsdaten für einen einzelnen Speicher nur zeigen
CREATE OR REPLACE VIEW sales_data AS 
SELECT s.storename AS "Store", 
     e.employee_name AS "Employee", 
     e1.employee_name AS "Manager", 
     SUM(p.total_sale_value) AS "Sales Value" 
FROM fss_Shop s 
     JOIN Employee e ON e.storeid = s.storeid 
     JOIN Payment p ON p.employee_number = e.employee_number 
     JOIN Employee e1 ON e1.employee_number = e.manager_number 
WHERE s.storeid=1 
GROUP BY e.employee_name 
ORDER BY SUM(p.total_sale_value) DESC LIMIT 1; 

Die obige Abfrage und das, wie ich seinen Grund habe WHERE s.storeid=1 angegeben. Ich habe 20 Geschäfte in meinem Tisch. Wie kann ich die obige Abfrage so ändern, dass sie mir Verkaufsdaten für 20 Filialen gibt (also 20 Zeilen).

+2

Wenn Sie das 'WHERE s.storeid = 1 'entfernen, können Sie die Gruppe nach' GROUP BY e.employee_name, s.storeid' erstellen und sehen, ob das funktioniert? – dimwittedanimal

+0

@dimwittedanimal Das ist viel besser. Aber es gibt mir immer noch mehrere Verkäufer aus demselben Laden. – HoldTight

+2

Entfernen Sie Where-Klausel und aktualisieren Sie Ihre 'GROUP BY s.storeid' –

Antwort

1
CREATE OR REPLACE VIEW employee_sales_totals AS 
    SELECT 
     e.*, 
     SUM(p.total_sale_value) AS total_sale_value 
    FROM 
     Employee e 
    INNER JOIN 
     Payment p 
      ON p.employee_number = e.employee_number 
    GROUP BY 
     e.id -- This should be the Primary Key/Surrogate Key of the employee table 
; 

CREATE OR REPLACE VIEW shop_top_employee_by_sales_value AS 
    SELECT 
     s.storename   AS "Store", 
     e.employee_name  AS "Employee", 
     m.employee_name  AS "Manager", 
     p.total_sale_value AS "Sales Value" 
    FROM 
    (
     SELECT storeid, MAX(total_sale_value) AS total_sale_value 
      FROM employee_sales_totals 
     GROUP BY storeid 
    ) 
     p 
    INNER JOIN 
     employee_sales_totals e 
      ON e.storeid   = p.storeid 
      AND e.total_sale_value = p.total_sale_value 
    INNER JOIN 
     fss_Shop s 
      ON s.storeid = e.storeid 
    INNER JOIN 
     Employee m 
      ON m.employee_number = e.manager_number 
; 

gemäß den Beantworten Sie Ihre vorherige Frage, wenn mehrere Mitarbeiter für denselben Gesamtumsatz im selben Geschäft gebunden sind, würden alle diese Mitarbeiter zurückgegeben.

+0

Ich bekomme einen Syntaxfehler in Zeile 4. 'SUM (p.total_sales_value) AS total_sales_value FROM Mitarbeiter e INNERER JOIN 'bei Zeile 4 ' – HoldTight

+0

@HoldTight - Es ist nur ein Komma fehlt am Ende der Zeile vor. – MatBailie

+0

Jetzt gibt es einen bei 'Zeile 2' für die zweite Abfrage – HoldTight

1

Betrachten wir ein Ranking Variable von SalesValue für jeden Mitarbeiter pro Filiale und dann den RANK=1 in äußeren Abfrage wählen:

SELECT main.Store, main.Employee, main.Manager, main.SalesValue 
FROM 
(SELECT agg.*,  
     @store:=agg.Store AS CURR_STORE, 
     @rank:=CASE WHEN @val > agg.SalesValue THEN @rank+1 ELSE 1 END AS RANK, 
     @val:=CASE WHEN @store <> agg.Store THEN @val ELSE agg.SalesValue END AS CURR_VAL 
    FROM 
    (SELECT s.storename AS "Store", 
      e.employee_name AS "Employee", 
      e1.employee_name AS "Manager", 
      SUM(p.total_sale_value) AS "SalesValue" 
    FROM fss_Shop s 
    INNER JOIN Employee e ON e.storeid = s.storeid 
    INNER JOIN Payment p ON p.employee_number = e.employee_number 
    INNER JOIN Employee e1 ON e1.employee_number = e.manager_number 
    GROUP BY s.storename, 
       e.employee_name, 
       e1.employee_name 
    ) As agg 
    CROSS JOIN (SELECT @rank:= 0) AS r1 
    CROSS JOIN (SELECT @val:= 0) AS r2 
    CROSS JOIN (SELECT @store:= 0) AS r3 
    ORDER BY agg.Store, agg.SalesValue DESC 
) As main 
WHERE main.RANK = 1; 

DEMO

Rextester(mit Zufallsdaten mit nur einem Verkaufstabelle)


Alternativ

, wenn Variablen kann nicht verwendet werden, sollten die Schaffung von zwei Ansichten, in denen letztere Referenzen die ehemalige: 1) den ursprünglichen Aggregatabfrage, 2) Unterabfrage korreliert Top-Mitarbeiter abrufen pro Speicher

CREATE OR REPLACE VIEW sales_data AS 
SELECT s.storename AS "Store", 
     e.employee_name AS "Employee", 
     e1.employee_name AS "Manager", 
     SUM(p.total_sale_value) AS "SalesValue" 
FROM fss_Shop s 
INNER JOIN Employee e ON e.storeid = s.storeid 
INNER JOIN Payment p ON p.employee_number = e.employee_number 
INNER JOIN Employee e1 ON e1.employee_number = e.manager_number 
GROUP BY s.storename, 
     e.employee_name, 
     e1.employee_name; 

CREATE OR REPLACE VIEW top_sales_data AS 
SELECT s.* 
FROM sales_data s 
WHERE (SELECT Count(*) FROM sales_data sub 
     WHERE sub.SalesValue > s.SalesValue 
     AND sub.Store = s.Store) = 0; 
+0

Sie können Variablenzuweisungen in Ansichten nicht verwenden. – MatBailie

+1

Guter Fang! In der Tat wird MySQL eines Tages bald [Fensterfunktionen] (https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html) haben, da Version 8 vielversprechend ist! Ich füge eine Alternative hinzu. – Parfait

+0

Ich denke du solltest '= 0' haben? Wie in "wo gibt es keine Zeilen mit einem höheren Verkaufswert"? Das heißt 'NOT EXISTS ()' kann etwas schneller sein ... – MatBailie

Verwandte Themen