2016-04-18 7 views
1

Ich habe Probleme beim Schreiben einer MySQL-Unterabfrage.mysql Unterabfrage auf der gleichen Tabelle

Die Tabelle SALES hat die Spaltennamen:

sales_date | staff_id | sales_amount 

jedes einzelnen Mitarbeiters Verkäufe aufzuzeichnen.

Was ich mit dieser Abfrage erreichen möchte, ist eine Tabelle, die den durchschnittlichen täglichen Umsatz eines ausgewählten Mitarbeiters sowie den durchschnittlichen täglichen Umsatz aller Mitarbeiter anzeigt. Ich möchte nur Tage anzeigen, an denen der ausgewählte Mitarbeiter einen Umsatz erzielt hat.

SELECT staff_id, sales_date, AVG(sales_amount) AS avgsales, sales_amount 
FROM sales 
GROUP BY sales_date 
WHERE 
    (SELECT sales_date 
    FROM sales 
    WHERE staff_id = $staff_id) // this subquery shows all the dates that staff has records in 

Ich mag es so etwas wie dies anzuzeigen:

Staff_id | Sales date | AverageSales | Employee_sales 
    ---------+------------+--------------+---------------- 
    001  | 2016-04-18 | £2000  | £1800 
    ---------+------------+--------------+---------------- 
    001  | 2016-04-17 | £3405  | £4000 
    ---------+------------+--------------+---------------- 
    001  | 2016-04-16 | £1450  | £1400 
    ---------+------------+--------------+---------------- 

Antwort

2

I Oracle verwenden, so wird es wahrscheinlich ein Tippfehler in dieser MySQL SQL sein. Aber, ich hoffe, es funktioniert einwandfrei ...

Sie haben zwei Konzepte: Durchschnittlicher Umsatz für jeden Tag und durchschnittlichen Umsatz pro Benutzer pro Tag. Sie möchten diese beiden Dinge zusammenfügen. Du kannst es leicht.

Zuerst haben Sie den durchschnittlichen Umsatz pro Tag.

select sales_date, avg(sales_amount) as averagesales 
from sales 
group by sales_date 

Jetzt möchten Sie den durchschnittlichen Umsatz pro Benutzer pro Tag.

select staff_id, sales_date, avg(sales_amount) as employeesales 
from sales 
group by sales_date, staff_id 

Sie wollen diese zusammengefügt. Das ist einfach.

select * from (
    select sales_date, avg(sales_amount) as averagesales 
    from sales 
    group by sales_date 
)a join (
    select staff_id, sales_date, avg(sales_amount) as employeesales 
    from sales 
    group by sales_date, staff_id 
)b on a.sales_date=b.sales_date 

, die Sie staff_id, sales_date, durchschnittlicher Umsatz für den Tag und Mitarbeiter durchschnittlicher Verkauf für den Tag in einer Abfrage. Sie werden es wahrscheinlich so bestellen wollen, wie Sie möchten, die Termine und andere Dinge begrenzen.

+0

das hat super funktioniert, vielen Dank! –

+0

Wenn Sie der Meinung sind, dass dies eine korrekte Antwort ist, klicken Sie auf das Häkchen neben der Frage, damit andere die richtige Antwort auf diese Seite sehen. – kainaw

0

Sie können eine Tabelle mit sich selbst in einer Abfrage verknüpfen, anstatt eine Unterabfrage zu verwenden. Versuchen Sie folgendes:

SELECT sales.staff_id, sales.sales_date, AVG(sales.sales_amount), AVG(emp.sales_amount) 
FROM sales 
LEFT JOIN sales emp ON (emp.staff_id=$staff_id) 
WHERE sales.staff_id=$staff_id 
GROUP BY sales_date; 

So im Wesentlichen schafft dies eine zweite Tabelle nur die ausgewählten Mitarbeiter Umsatz enthält, die Sie dann den Durchschnitt.