0

私は次のようにテーブル(消費)を持っています:

DocDate   ItemCode    Quantity
01.01.09  A           5
02.01.09  A           6

など..通年

次のような結果が必要です。

品目コード Jan09Total Feb09Total Mar09Total

問題は、数量を月ごとに合計する必要があることです。これは列にあり、特定の日付基準に従っている必要があります。たとえば、1 月から 3 月まで、または 2 月から 7 月までなどです。

再帰クエリを使用してこれを実現する方法。

ありがとうラフル

4

4 に答える 4

2

PIVOT をサポートする DB を使用する場合は、それを使用する必要があります。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
  )
);

ロビンが指摘したように、列が異なる場合は、正しい列を使用してそのようなクエリを動的に生成する必要があります。

于 2009-06-01T12:27:50.903 に答える
1

まあ、それは再帰的ではありませんが、これはあなたが望むものを得るでしょう:

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

再帰は、このクエリのパフォーマンスを妨げるだけだと思います。よろしいですか?それともこれはただの宿題ですか?

于 2009-06-01T12:12:41.137 に答える
0

これは、既知の x 軸値にピボット ロジックを実装するための素晴らしく洗練された方法へのリンクです。動的ピボットはより困難です。

私はこの記事を十分に読んでいないので、役に立たない場合は「ローゼンシュタイン メソッド」を検索してください。

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

私はこれを多くのクエリで使用しており、素晴らしい結果が得られています。

于 2009-06-01T12:31:38.850 に答える
0

PIVOT を使用して必要に応じてデータを列に入れることができますが、事前に列のリストを定義する必要があります。したがって、(日付範囲に基づいて) 必要な列の動的 SQL を作成し、それを実行して PIVOT を生成する必要があります。

于 2009-06-01T12:14:27.140 に答える