1

私たちのデータベースには、これらの行に沿って 10 進数の日付形式を使用するいくつかのテーブルがあります: yyyymmdd、すべて 1 つの大きな 10 進数として (つまり、今日は 20130225 になります)。毎月のバケットに戻す SQL クエリを作成しようとしています。私の調査によると、数字を 100 で割り、右端の日を切り捨てるのが最善の方法のようです (残りを削除すると、20130225/100 は 201302 に等しくなります)。

私はそれを機能させる方法を理解できないようです。(INVOICE_DATE/100) As "INVOICE_MONTH"Select と Group by の両方で、次のようなものを使用することから始めました。それがうまくいかなかったとき、グループを に減らしてから に減らしました"INVOICE_MONTH"(INVOICE_DATE/100)、どちらもうまくいきませんでした。そのため、Select と Group by を削減しましたが、INVOICE_DATE/100まだ機能していないようです。

これが現在の私のコードです(いくつかの小さな編集があります)

Select  Count(COMPETITOR_NAME) as "STORE COUNT",
    COMPETITOR_NAME,
    INVOICE_DATE/100,
    CUSTOMER_NUMBER,   
    OVERRIDE_TYPE,
    Sum (QTY_SOLD) as "Quantity Sold",
    Sum (EXT_ORIGINAL_PRICE) as "Sum Original Price", 
    Sum (EXT_OVERRIDE_PRICE) as "Sum Override Price", 
    Sum (EXT_VARIANCE) As "Sum Variance",
    Sum (INTERNAL_COST) as "Internal Cost"
From    DA*****.DW*******.PRCOVRWK
Where   INVOICE_DATE/100 between 201002 and 201302
Group By    ROLLUP(COMPETITOR_NAME,
    INVOICE_DATE/100),
    OVERRIDE_TYPE,
    CUSTOMER_NUMBER
Order By    OVERRIDE_TYPE,
    COMPETITOR_NAME,
    INVOICE_DATE,
    CUSTOMER_NUMBER

私の Where ステートメントも問題を引き起こしているのではないかと思わずにはいられません。最初は だけを使ってWhere INVOICE_DATE between 20100225 and 20130225いたのですが、Select ステートメントと同じものを使用する必要があるのではないかと思いました。(ええ、私はこの時点で少し手を伸ばしています。) IBM の Web サイトのドキュメントに従うために最善を尽くしてきましたが、期待どおりに機能していないように見えるので、間違って読んでいるに違いありません。

とにかく。基本的なニーズは、情報を毎月のバケットに戻すことができることです。したがって、別のアプローチを知っていれば、それが達成される可能性があります。私の希望は、10 進数の除算を使用して年/日付の組み合わせを取得し、それを Group By で使用して必要な結果を取得できるようにすることです。

PS- DB2 for i の v5,1 を使用しています。

4

5 に答える 5

1

小数の日付は、私たちの生活を必要以上に困難にします。Alan CampinのIDate関数を使用することをお勧めしますか?これらの小数をSQL日付データ型に簡単に変換できます。それができたら、年と月を抽出して、それらに対してGROUPBYを実行できます。

あなたは本当にV5R1を使用していますか?ROLLUPがそんなに早く効いたとは思いませんでした...

于 2013-02-25T15:09:17.640 に答える
1

Shot in the dark:INTデータを強制的に整数にするために を使用してみましたか? のようにINT(INVOICE_DATE/100)

これの他の「つづり」はINTEGER(INVOICE_DATE/100)またはかもしれませんCAST(INVOICE_DATE/100 AS INTEGER)

于 2013-02-26T07:10:07.350 に答える
1

小数を日付に変換してみてください。

select digits(date), 
  year(date(
    substr(digits(date),1,4) concat 
    ''-'' concat 
    substr(digits(date),5,2) concat
    ''-'' concat substr(digits(date),7,2))) as year,
  month(date(
    substr(digits(date),1,4) concat 
    ''-'' concat 
    substr(digits(date),5,2) concat
    ''-'' concat substr(digits(date),7,2))) as month
from ....

ここで重要なのは、それを文字に変換してから部分文字列に変換し、適切な日付区切り文字を挿入することです。

次に、GROUP BY に対してもう一度やり直します。これまでで最も厄介な SQL ステートメントになりますが、すべてクライアント側になります。

于 2013-02-25T17:12:51.487 に答える
0

問題はロールアップの構文だと思います。ドキュメントを確認してください。. . 式group by rollupは、すべての列でのみ機能します。だから、これを試してください:

Group By ROLLUP (COMPETITOR_NAME,
    INVOICE_DATE/100,
    OVERRIDE_TYPE,
    CUSTOMER_NUMBER)

または、さまざまな組み合わせにグループ化セットを使用します。

また、明示的に整数除算を使用することをお勧めします。したがって、次のように置き換え\ますidiv

invoice_date idiv 100
于 2013-02-25T14:16:20.047 に答える
0

実際、答えはかなり単純であることが判明しました。問題は、部門が に適切にリストされていなかったことOrder Byです。それは問題ではなかったようですが、一度それを行うと、すべてがうまくいきました。

私は小数の答えになってしまいました。丸めを使用して修正することにしましたが、うまくいったようです。好奇心旺盛な人のために最終的に作成したコードは次のとおりです。

Select  Count(COMPETITOR_NAME) as "STORE COUNT",
    COMPETITOR_NAME,
    ROUND(INVOICE_DATE/100, 0) As "Month_Date",
    CUSTOMER_NUMBER,   
    OVERRIDE_TYPE,
    Sum (QTY_SOLD) as "Quantity Sold",
    Sum (EXT_ORIGINAL_PRICE) as "Sum Original Price", 
    Sum (EXT_OVERRIDE_PRICE) as "Sum Override Price", 
    Sum (EXT_VARIANCE) As "Sum Variance",
    Sum (INTERNAL_COST) as "Internal Cost"
From    DA******.DW*******.PRCOVRWK
Where   INVOICE_DATE > 20100201
Group By    COMPETITOR_NAME,
    ROUND(INVOICE_DATE/100, 0),
    OVERRIDE_TYPE,
    CUSTOMER_NUMBER
Order By    COMPETITOR_NAME,
    ROUND(INVOICE_DATE/100, 0),
    SUM (EXT_VARIANCE),
    CUSTOMER_NUMBER

ばかげているように見えるかもしれませんが、DB2 V5,1 はSelectGroup Byとの間でステートメントを一致させることを本当に望んでいましたOrder By。まあ、ほぼ同じですが、で使用できますAsが、他の場所では使用できSelectません。

これが、同様の問題を抱えていると思われる他の人の助けになることを願っています。

于 2013-02-28T18:44:49.037 に答える