Итоги за месяц в столбцах - PullRequest
0 голосов
/ 01 июня 2009

У меня есть таблица (Потребление) следующим образом:

DocDate   ItemCode    Quantity
01.01.09  A           5
02.01.09  A           6

и т. Д. На весь год

Мне нужны следующие результаты:

ItemCode Jan09Total Feb09Total Mar09Total

Проблема в том, что суммы должны суммироваться за месяцы, которые должны быть в столбцах и в соответствии с критериями даты предоставления, например, с января по март 09 или с февраля по 09 июля и т. Д. *

Как этого добиться с помощью рекурсивного запроса.

Спасибо Рахул

Ответы [ 4 ]

2 голосов
/ 01 июня 2009

Если вы используете БД, которая поддерживает PIVOT, вы должны использовать ее. Вот пример кода для Oracle:

CREATE TABLE Consumption (
  DocDate  DATE,
  ItemCode VARCHAR2(10),
  Quantity NUMBER
);

INSERT INTO Consumption VALUES(to_date('2009-01-01', 'YYYY-MM-DD'), 'A', 5);
INSERT INTO Consumption VALUES(to_date('2009-02-01', 'YYYY-MM-DD'), 'A', 6);
INSERT INTO Consumption VALUES(to_date('2009-01-01', 'YYYY-MM-DD'), 'B', 5);

SELECT * FROM Consumption
PIVOT(
  sum(Quantity)
  FOR DocDate IN (
    to_date('2009-01-01', 'YYYY-MM-DD') AS Jan09Total,
    to_date('2009-02-01', 'YYYY-MM-DD') AS Feb09Total
  )
);

Как отметил Робин, если ваши столбцы различаются, вам придется динамически генерировать такой запрос с правильными столбцами.

1 голос
/ 01 июня 2009

Ну, это не рекурсивно, но вы получите то, что хотите:

SELECT
    DateName(month, DocDate) + ' ' + CAST(YEAR(DocDate) AS VARCHAR(10)) AS MonthYear,
    ItemCode,
    SUM(Quantity)
FROM
    Consumption
GROUP BY
    DateName(month, DocDate) + ' ' + CAST(YEAR(DocDate) AS VARCHAR(10)) AS MonthYear,
    ItemCode
ORDER BY
    1,2

Я думаю, что рекурсия только помешает выполнению этого запроса. Вы уверены, что хотите это сделать? Или это просто домашнее задание?

0 голосов
/ 01 июня 2009

Вот ссылка на удивительно элегантный способ реализации логики поворота на ИЗВЕСТНЫХ значениях оси x. Динамические точки сложнее.

Я не прочитал эту статью полностью, поэтому, если она бесполезна, посмотрите «Метод Розенштейна»

http://www.stephenforte.net/default.aspx?date=2003-08-07

Я использовал это во многих запросах с отличными результатами.

0 голосов
/ 01 июня 2009

Вы можете использовать PIVOT, чтобы получить данные в столбцы так, как вы хотите, однако, список столбцов должен быть определен заранее. Поэтому вам нужно будет создать динамический SQL для нужных вам столбцов (на основе вашего диапазона дат), а затем запустить его для генерации PIVOT.

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