2015-07-07 2 views
4

У меня есть таблица базы данных с тремя столбцами.Запрос на получение лучших результатов по продажам за предыдущую неделю

WeekNumber, ProductName, SalesCount

Образец данные приведены в таблице ниже. Я хочу получить 10 лучших игроков (на%) за неделю 26 за предыдущую неделю, т. Е. Неделю 25. Единственное условие заключается в том, что продукт должен иметь счет продаж больше 0 за обе недели.

В данных выборки B, C, D являются общими продуктами, а C имеет наибольший коэффициент усиления%.

Аналогичным образом, мне также нужны 10 лучших проигравших.

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

enter image description here

Результат должен быть, как

Product PercentGain 

    C   400% 

    D   12.5% 

    B   10% 
+0

Дайте нам структуру таблицы и то, что вы пытались до сих –

+0

Можете ли вы предоставить образец требуемой мощности (используйте небольшое количество, 2, вместо 10) – Amit

+0

пожалуйста, напишите пример вывода – mohan111

ответ

4

Это даст вам общий ответ, а не только для какой-либо конкретной недели:

select top 10 product , gain [gain%] 
from 
(
SELECT product, ((curr.salescount-prev.salescount)/prev.salescount)*100 gain 
from 
    (select weeknumber, product, salescount from tbl) prev 
    JOIN 
    (select weeknumber, product, salescount from tbl) curr 
on prev.weeknumber = curr.weeknumber - 1 
AND prev.product = curr.product 
where prev.salescount > 0 and curr.salescount > 0 
)A 
order by gain desc 

Если вы заинтересованы в 25 недель и 26, то просто добавьте условие ниже в пункт WHERE:

and prev.weeknumber = 25 
+1

Все, что касается этого запроса, является правильным, за исключением формулы. Вместо (curr.salescount-prev.salescount) /curr.salescount, я использую ((curr.Sales - prev.Sales) * 100) /prev.Sales. Спасибо за ответ. –

+1

Отредактировано с правильной формулой. – SouravA

1

Если вы используете SQL-Server 2012 (или новее), вы можете использовать функцию lag для сопоставления «этих» недель с предыдущей неделей. Оттуда это всего лишь математика:

SELECT TOP 10 product, sales/prev_sales - 1 AS gain 
FROM  (SELECT product, 
       sales, 
       LAG(sales) OVER (PARTITION BY product 
            ORDER BY weeknumber) AS prev_sales 
      FROM mytable) t 
WHERE weeknumber = 26 AND 
     sales > 0 AND 
     prev_sales > 0 AND 
     sales > prev_sales 
ORDER BY sales/prev_sales 
+0

OP не говорит, является ли это SQL Server 2012+. Вы должны явно указать этот пункт. – SouravA

+0

@Sourav_Agasti Поскольку SQL-Server 2012 уже несколько лет, я просто предположил, что OP не будет использовать ничего более старого. Но вы правы, об этом нужно заявить. Я отредактировал свой ответ с этим разъяснением. – Mureinik

1

Это запрос.

select top 10 product , gain [gain%] 
from 
(
SELECT curr.Product, ((curr.Sales - prev.Sales) *100)/prev.Sales gain 
from 
    (select weeknumber, product, sales from ProductInfo where weeknumber = 25) prev 
    JOIN 
    (select weeknumber, product, sales from ProductInfo where weeknumber = 26) curr 
on prev.product = curr.product 
where prev.Sales > 0 and curr.Sales > 0 
)A 
order by gain desc 
+0

Прошу прощения, 'SQL fiddle' не работает прямо сейчас, есть некоторая ошибка. –