SQL-запрос для расчета ежемесячного процента роста - PullRequest
1 голос
/ 06 июля 2011

Мне нужно построить запрос из 4 столбцов (sql 2005).

Column1: Product
Column2: Units sold
Column3: Growth from previous month (in %)
Column4: Growth from same month last year (in %)

В моей таблице год и месяцы имеют пользовательские целочисленные значения. Например, самый последний месяц - 146, но также в таблице есть столбец год (например, 2011) и месяц (например, 7).

Можно ли сделать это за один запрос или мне нужно начать использовать временные таблицы и т. Д.?

Ценю любую помощь.

спасибо,

KS

Ответы [ 3 ]

1 голос
/ 06 июля 2011

Я надеюсь, что получил их всех:

SELECT
  Current_Month.product_name, units_sold_current_month,
  units_sold_last_month * 100 / units_sold_current_month prc_last_month,
  units_sold_last_year * 100 / units_sold_current_month prc_last_year
FROM
  (SELECT product_id, product_name, sum(units_sold) units_sold_current_month FROM MyTable WHERE YEAR = 2011 AND MONTH = 7) Current_Month
  JOIN
  (SELECT product_id, product_name, sum(units_sold) units_sold_last_month FROM MyTable WHERE YEAR = 2011 AND MONTH = 6) Last_Month
  ON Current_Month.product_id = Last_Month.product_id
  JOIN 
  (SELECT product_id, product_name, sum(units_sold) units_sold_last_year FROM MyTable   WHERE YEAR = 2010 AND MONTH = 7) Last_Year
  ON Current_Month.product_id = Last_Year.product_id
1 голос
/ 06 июля 2011

KS, Чтобы сделать это на лету, вы можете использовать подзапросы.

SELECT product, this_month.units_sold,
    (this_month.sales-last_month.sales)*100/last_month.sales,
    (this_month.sales-last_year.sales)*100/last_year.sales
    FROM (SELECT product, SUM(units_sold) AS units_sold, SUM(sales) AS sales
            FROM product WHERE month = 146 GROUP BY product) AS this_month,
         (SELECT product, SUM(units_sold) AS units_sold, SUM(sales) AS sales
            FROM product WHERE month = 145 GROUP BY product) AS last_month,
         (SELECT product, SUM(units_sold) AS units_sold, SUM(sales) AS sales
            FROM product WHERE month = 134 GROUP BY product) AS this_year
    WHERE this_month.product = last_month.product
      AND this_month.product = last_year.product

Если есть случай, когда продукт был продан в течение одного месяца, но не другого месяца, вам придется выполнить левое объединение и проверить наличие нулевых значений, особенно если last_month.sales или last_year.sales равен 0.

1 голос
/ 06 июля 2011

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

SELECT <growth computation here> 
  FROM SALES s1 LEFT JOIN SALES s2 ON (s1.month = s2.month-1) -- last month join
                LEFT JOIN SALES s3 ON (s1.month = s3.month - 12) -- lat year join

, где <growth computation here> выглядит как

((s1.sales - s2.sales)/s2.sales * 100), 
((s1.sales - s3.sales)/s3.sales * 100)

Я использую LEFT JOIN в течение месяцев, которыене было предыдущих месяцевИзмените условия присоединения на основе фактических отношений в столбцах месяц / год.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...