2016-04-18 3 views
1

У меня возникли проблемы с записью подзапроса MySQL.подзапрос mysql в той же таблице

В таблице SALES имеет названия столбцов:

sales_date | staff_id | sales_amount 

для записи продаж каждого отдельного сотрудника.

То, что я пытаюсь достичь с помощью этого запроса, представляет собой таблицу, которая отображает среднесуточные продажи для выбранного сотрудника, а также среднесуточные продажи для всех сотрудников. Я хочу показывать только дни, когда у выбранного сотрудника были продажи.

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 

Я хочу, чтобы показать что-то вроде этого:

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 
    ---------+------------+--------------+---------------- 

ответ

2

Я использую Oracle, так что, вероятно, будет опечатка в этом MySQL SQL. Но, надеюсь, он работает нормально ...

У вас есть два понятия: средний объем продаж для каждого в день и средний объем продаж на пользователя в день. Вы хотите присоединиться к этим двум вещам вместе. Вы можете легко.

Во-первых, у вас есть средний объем продаж в день.

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

Теперь вам нужны средние продажи на пользователя в день.

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

Вы хотите, чтобы они объединились. Это просто.

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 

Это даст вам staff_id, sales_date, средние продажи в течение дня, и работник средние продажи за день в одном запросе. Вы, скорее всего, захотите заказать его именно так, как вам нравится, ограничьте даты и другие вещи.

+0

Это сработало отлично, спасибо вам большое! –

+0

Если вы считаете, что это правильный ответ, нажмите галочку рядом с вопросом, чтобы другие увидели его как правильный ответ при просмотре этой страницы. – kainaw

0

Вы можете присоединить таблицу к себе в запросе, а не использовать подзапрос. Попробуйте следующее:

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; 

По существу это создает вторую таблицу, содержащую только продажи выбранного сотрудника, которые вы можете затем усреднить.

Смежные вопросы