2016-06-19 5 views
4

Мне нужно написать запрос mysql, чтобы найти общий объем продаж в определенные дни. Я могу найти его, но не могу показать комбинированные результаты.Запрос MySQL для отображения комбинаций вывода

таблица выглядит следующим образом:

Date, Order_id, Product_id, Quantity 
'01-JUL-11',O1,P1,5 
'01-JUL-11',O2,P2,2 
'01-JUL-11',O3,P3,10 
'01-JUL-11',O4,P1,10 
'02-JUL-11',O5,P3,5 
'02-JUL-11',O6,P4,6 
'02-JUL-11',O7,P1,2 
'02-JUL-11',O8,P5,1 
'02-JUL-11',O9,P6,2 
'02-JUL-11',O10,P2,4 

Желаемая Выход:

Product_id Total Sales on Day '02-JUL-11' Total Sales on Day '02-JUL-11' 
P1 15 2 
P2 2 4 
P3 10 5 
P4 0 6 
P5 0 1 
P6 0 2 

То, что я попытался это:

Select distinct product_id 
from orders; 

Выход:

P1 
P2 
P3 
P4 
P5 
P6 

Select product_id, sum(quantity) from orders 
where order_day = '11-07-01' 
group by product_id 

ВЫВОД:

P1 15 
P2 2 
P3 10 


Select product_id, sum(quantity) from orders 
where order_day = '11-07-02' 
group by product_id 

ВЫВОД:

P1 2 
P2 4 
P3 5 
P4 6 
P5 1 
P6 2 

Это дает мне желаемый результат, но я хочу, чтобы каким-то образом объединить столбцы.

запрос, который работал для меня: (Тем не менее ставит нуль при 0)

Select X.product_id, X.s, Y.t from 
(SELECT A.product_id as product_id, B.s as s FROM 
(Select distinct product_id 
from orders) A 
LEFT JOIN 
(Select product_id, sum(quantity) as s from orders 
where order_day = '11-07-01' 
group by product_id) B 
ON A.product_id = B.product_id) X 
Left join 
(Select product_id, sum(quantity) as t from orders 
where order_day = '11-07-02' 
group by product_id) Y 
on X.product_id = Y.product_id; 
+0

Ваш входной и выходной образец Безразлично» t, но я _think_ вы могли бы уйти с простым сводным запросом. –

ответ

2

Если вам нужен только два дня, суммированный в отчете, то простой (не динамический) поворот запрос должен сделать трюк:

SELECT product_id, 
    SUM(CASE WHEN order_day = '11-07-01' THEN quantity ELSE 0 END) AS `Total Sales on Day '01-JUL-11'`, 
    SUM(CASE WHEN order_day = '11-07-02' THEN quantity ELSE 0 END) AS `Total Sales on Day '02-JUL-11'` 
FROM orders 
WHERE order_day = '11-07-01' OR order_day = '11-07-02' 
GROUP BY product_id 
+0

Можете ли вы объяснить этот подзапрос: SUM (CASE WHEN order_day = '11 -07-01 'THEN количество ELSE 0 END) – Raj

+1

@Parin Это будет суммировать 'количество' _only_ за определенный день, в противном случае это займет 0. И это будет применяется к каждой записи в подзапросе. –

+0

Спасибо, его читаем, но я хотел знать, как вы пришли по этому запросу. Если бы я знал об этом синтаксисе, возможно, я мог бы написать этот код. В ближайшее время у меня будет интервью с amazon, можете ли вы предложить какой-то учебный материал, который обогатит меня такими знаниями. (Я решил hackkerrank и leetcode) – Raj

1

Условное агрегирование - это путь. Но вы должны научиться использовать правильные форматы даты. Стандарт ISO/ANSI является YYYY-MM-DD или YYYYMMDD:

Select product_id, 
     sum(case when order_day = '2011-07-01' then quantity else 0 end) as q_20110701,  
     sum(case when order_day = '2011-07-02' then quantity else 0 end) as q_20110702 
from orders o 
where order_day in ('2011-07-01', '2011-07-02') 
group by product_id; 

Альтернатива, если вы можете жить с отдельными рядами на каждый день, это:

Select product_id, order_day, sum(quantity) 
from orders 
where order_day in ('2011-07-01', '2011-07-02') 
group by product_id, order_day, 
+0

сумма (в случае, когда order_day = '2011-07-01' then quantity else 0 end) Можете ли вы это объяснить? – Raj

+0

Это условная агрегация. Он добавляет суммы 'количество' всякий раз, когда дата является указанной датой. –

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