1

誰かがこのコードを手伝ってくれるかどうか疑問に思っています。データをクエリして、前年の YTD 用と今年の YTD 用の 2 つのエントリを取得したいと考えています。

これを行う方法を知っている唯一の方法は、where 句を使用した 2 つの個別のクエリです。クエリを 2 回実行する必要はありません。

DatePeriod という名前の 1 つの列に 2011 YTD と 2012YTD が入力されていますが、2011YTD、2012YTD、2011Total、2012Total を実行できるようになればさらに良いでしょう。ただし、これは 4 つのクエリであると推測しています。

ありがとう

編集:いくつかのことを片付けるのを助けるために:これはMS SQLでコーディングされています。

データは次のようになります: (非常に基本的な例)

Date       |   Call_Volume
1/1/2012   |   4

私が望むのは、Call_Volume合計を取得することです。週ごとにグループ化するクエリと、月ごとにグループ化するクエリがあります。すべての日次データを取り込み、Excel でこれを行うこともできますが、テーブルには何百万もの行があるため、常に出力のサイズを小さくすることをお勧めします。

私は現在、週/月と年でグループ化し、すべてを結合して1つの出力にしています。しかし、それは私が同じテーブルにアクセスする3つのクエリを持っていることを意味し、大きな痛み、非常に遅く効率的ではなく、それは問題ありませんが、YTDも必要なので、もう1つのクエリか、年次クエリに追加する方法を見つけることができればそれは理想的です:

そう

DatePeriod   |   Sum_Calls
2011 Total   |   40
2011 YTD     |   12
2012 Total   |   45
2012 YTD     |   15

これが意味をなすことを願っています。

4

1 に答える 1

1

SQLは、列ではなく行に対して操作を実行するように構築されています(もちろん、列を選択しますが、集計操作はすべて行に対して行われます)。

これに対する最も標準的なアプローチは次のようなものです。

SELECT SUM(your_table.sales), YEAR(your_table.sale_date)
FROM your_table
GROUP BY YEAR(your_table.sale_date)

これで、処理できる年数に制限がなく、レコードの各年に1行が取得されます。すでに別のフィールドでグループ化している場合は、それで問題ありません。次に、これらの各グループで、毎年1行ずつ取得します。

その後、プログラムは行を繰り返し処理し、必要に応じて行を整理/レンダリングできます。

絶対に、積極的に代わりに列が必要な場合は、次のような問題が発生します。

SELECT SUM(IF(YEAR(date) = 2011, sales, 0)) AS total_2011,
  SUM(IF(YEAR(date) = 2012, total_2012, 0)) AS total_2012
FROM your_table

プログラムでクエリを作成している場合は、必要な数の列条件を追加できますが、これが非常に効率的に実行されることは期待できません。

(これらの例は、いくつかのMySQL固有の関数で記述されています。対応する関数は他のエンジンにも存在しますが、構文は少し異なります。)

于 2012-04-17T17:32:30.420 に答える