2015-09-03 3 views
0

У меня есть продажа таблиц, в которых я показываю текущее среднее значение среднего квартала продукта в определенном регионе и этот продукт в предыдущем квартале. Моя таблица имеет структуру, как-Как присоединиться к этому запросу?

Region Product Year  Qtr  Month   Sales 
NORTH  P1  2015  1   JAN   1000 
SOUTH  P1  2015  1   FEB   3000 
NORTH  P1  2015  1   MAR   3000 
NORTH  P1  2015  2   APR   4000 
NORTH  P1  2015  2   MAY   5000 
NORTH  P1  2015  2   JUN   6000 
NORTH  P1  2015  3   JUL   7000 
NORTH  P1  2015  3   AUG   8000 
NORTH  P1  2015  3   SEP   9000 
NORTH  P1  2015  4   OCT   1000 
NORTH  P1  2015  4   NOV   2000 
NORTH  P1  2015  4   DEC   4000 
........ 
SOUTH  P3  2015  4   NOV   3000 
NORTH  P1  2015  1   FEB   2000 
SOUTH  P1  2015  1   JAN   2000 
SOUTH  P1  2015  1   JAN   4000 
SOUTH  P2  2016  1   JAN   2000 
SOUTH  P2  2016  1   JAN   4000 
NORTH  P1  2016  1   MAR   3000 
NORTH  P1  2016  1   FEB   1000 
NORTH  P1  2016  1   JAN   2000 

и у меня есть в этом выводе form-

Region Product Year Month Sales Qtr Avg_Sale Prev_Qtr_Sale 
    NORTH P1 2015 JAN 1000 1 2000  null 
    NORTH P1 2015 FEB 2000 1 2000  null 
    NORTH P1 2015 MAR 3000 1 2000  null 
    NORTH P1 2015 APR 4000 2 5000  2000 
    NORTH P1 2015 MAY 5000 2 5000  2000 
    NORTH P1 2015 JUN 6000 2 5000  2000 
    NORTH P1 2015 JUL 7000 3 8000  5000 
    NORTH P1 2015 AUG 8000 3 8000  5000 
    NORTH P1 2015 SEP 9000 3 8000  5000 
    NORTH P1 2015 OCT 1000 4 2333.3 8000 
    NORTH P1 2015 NOV 2000 4 2333.3 8000 
    NORTH P1 2015 DEC 4000 4 2333.33 8000 
    SOUTH P2 2015 JAN 8000 1 6000  null 
    SOUTH P2 2015 FEB 9000 1 6000  null 
    SOUTH P2 2015 MAR 1000 1 6000  null 
    SOUTH P2 2015 APR 2000 2 6333.33 6000 
    SOUTH P2 2015 MAY 8000 2 6333.33 6000 
    SOUTH P2 2015 JUN 9000 2 6333.33 6000 
    SOUTH P2 2015 JUL 1000 3 2333.33 6333.33 
    SOUTH P2 2015 AUG 2000 3 2333.33 6333.33 
    SOUTH P2 2015 SEP 4000 3 2333.33 6333.33 
    SOUTH P2 2015 OCT 5000 4 2666.67 2333.33 
    SOUTH P2 2015 NOV 2000 4 2666.67 2333.33 
    SOUTH P2 2015 DEC 1000 4 2666.67 2333.33 
    NORTH P3 2015 FEB 9000 1 5000  null 
    NORTH P3 2015 FEB 1000 1 5000  null 
    NORTH P3 2015 APR 2000 2 2000  5000 
    NORTH P3 2015 JUL 8000 3 8000  2000 
    SOUTH P3 2015 AUG 9000 3 9000  null 
    SOUTH P3 2015 OCT 1000 4 2000  9000 
    SOUTH P3 2015 NOV 3000 4 2000  9000 
    NORTH P1 2016 JAN 2000 1 2000  2333.33 
    NORTH P1 2016 FEB 1000 1 2000  2333.33 
    NORTH P1 2016 MAR 3000 1 2000  2333.33 
    SOUTH P2 2016 JAN 2000 1 3000  2666.67 
    SOUTH P2 2016 JAN 4000 1 3000  2666.67 
    SOUTH P1 2015 JAN 4000 1 3000  null 
    SOUTH P1 2015 JAN 2000 1 3000  null 
    SOUTH P1 2015 FEB 3000 1 3000  null 

нуль показывает, что нет никакой продажи этого продукта в предыдущем квартале. Запрос

это-
WITH AvgSales 
AS (SELECT 
region, 
product, 
year, 
qtr, 
ROUND(AVG(sales), 2) AS avg_Sale 
FROM sales 
GROUP BY region, 
product, 
year,qtr 
) 
SELECT 
s.region, 
s.product, 
s.year, 
s.month, 
s.sales, 
avg.qtr, 
avg.avg_Sale AS Qtr_Avg_Sale, 
prev.avg_sale AS Prev_Qtr_Avg_Sale 
FROM sales s 
JOIN AvgSales avg 
ON s.region = avg.region 
AND s.product = avg.product 
AND s.QTR = avg.qtr 
AND s.year = avg.year 
LEFT JOIN AvgSales prev 
ON (s.region = prev.region 
AND s.product = prev.product 
AND s.year - 1 = prev.year 
AND prev.qtr = 4) or 
(s.region = prev.region 
AND s.product = prev.product 
AND s.year = prev.year 
AND s.qtr - 1 = prev.qtr) ; 

У меня есть вопрос при вступлении в таблицу в второй присоединиться, как таблицы вступают в качестве условия объединения, почему в этом условии соединения оно не включая 2,3,4 квартала предыдущего года

s.region = prev.region 
    AND s.product = prev.product 
    AND s.year - 1 = prev.year 
    AND prev.qtr = 4 

Может ли кто-нибудь помочь?

+0

Я хочу знать, почему в этом состоянии присоединиться это не включая четверть 2,3,4 следующего года, поскольку они также удовлетворяющие этому условию. . :(Почему только первый квартал работает? –

+1

Мне кажется, что есть, вероятно, некоторые последующие вычисления (в отчете, возможно?), Которые требуют предыдущего года и/или предыдущего квартала (процентные вычисления, возможно?). как этот запрос используется, мы можем только догадываться. –

+0

Я не понимаю, что вы только что сказали @XLAnt –

ответ

1

Я абсолютно уверен, что Prev_Qtr_Sale столбец предназначен для отображения среднего объема продаж за квартал, непосредственно предшествующий квартал текущего года в колонках Qtr и Year - так для 2015, в среднем за 1 квартал 2015 год, и так далее.

Если это так, то в первом наборе условий, оставшихся присоединенными к prev, был исключен CTE; этот набор условий должен быть специально для частного случая, когда Qtr равен 1 (поэтому присоединился к последней четверти предыдущего года), но условие s.qtr = 1 было опущено.

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

LEFT JOIN AvgSales prev 
ON (s.region = prev.region 
AND s.product = prev.product 
AND s.year - 1 = prev.year 
AND s.qtr = 1 AND prev.qtr = 4) or 
(s.region = prev.region 
AND s.product = prev.product 
AND s.year = prev.year 
AND s.qtr - 1 = prev.qtr)