Заказать временный столбец типа char как целое число - PullRequest
0 голосов
/ 07 декабря 2011

Я пишу запрос, который будет показывать продажи за каждую неделю в течение двух лет.Поэтому я хочу сравнить недели с разными годами.Я получаю такие результаты (week - это число недель в этом году, например, первая неделя, вторая неделя 2010 года):

week|year|price
1   |2010|5
1   |2011|10
2   |2010|7
2   |2011|13

Все будет хорошо, но когда я пытаюсь отобразить результаты на графике, он считает как первые недели и так далее как одну и помещает его в одно поле.Итак, на графике я вижу, что первые недели продаж составляют 15, а секунд - 20. Поэтому я попытался объединить столбец недели с другим столбцом, чтобы отделить тот же номер недели для другого года.

SELECT
  min(so.id) as id,
  date_part('week',  so.date_order) || ' ' ||
  CASE
    WHEN
      so.date_order >='2010-01-01' and so.date_order <= '2010-12-31'
    THEN
      '2010'
    WHEN
      so.date_order >='2010-01-01' and so.date_order <= '2011-12-31'
    THEN
      '2011'
  END as week,
  date_part('year',  so.date_order) as year,
  count(*) as amount,
  sum(sol.price_unit) as price
FROM
  sale_order as so, 
  sale_order_line as sol
WHERE
  sol.order_id=so.id and
  so.date_order >= '2010-01-01' and so.date_order <= '2011-12-31'
GROUP BY
  week,
  year

Но затем столбецНеделя сортируется по типу символа, и я получаю результаты в следующем порядке:

week     |year|sales
1 - 2010 |2010|5
1 - 2011 |2011|10
10 - 2010|2010|15
11 - 2011|2011|12
2  - 2010|2010|7
2  - 2011|2011|13

Если я пытаюсь ORDER BY to_number(week, text(99999999)), я получаю сообщение об ошибке, что столбец week не существует.Я думаю, потому что это временный столбец?

Итак, мой вопрос: как правильно отсортировать столбец по временной неделе или есть лучший способ его отсортировать? :)) 1015 *

1 Ответ

1 голос
/ 07 декабря 2011

Я бы, наверное, переписал ваш запрос так:

SELECT
  MIN(id) AS id,
  week || ' ' || year AS week,
  year,
  COUNT(*) AS amount,
  SUM(price_unit) AS price
FROM (
  SELECT
    so.id,
    DATE_PART('week',  so.date_order) AS week,
    DATE_PART('year',  so.date_order) AS year,
    sol.price_unit
  FROM sale_order AS so
    INNER JOIN sale_order_line AS sol ON sol.order_id = so.id
  WHERE so.date_order BETWEEN '2010-01-01' AND '2011-12-31'
) AS x
GROUP BY
  year,
  week
ORDER BY
  week::int,
  year
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...