2012-04-17 20 views
1

誰かがこのコードを手助けできるかどうかわかりません。 データを照会して、前年のYTDと今年のYTDの2つのエントリを取得したいとします。前年と今年のSQL YTD

これを行う方法が分かっている唯一の方法は、where句と2つの別々のクエリです。私はクエリを2回実行する必要はありません。

2011年YTD、2012YTD、2012YTD、2011Total、2012Totalを行うことができれば、2011年YTDと2012YTDで作成された1つの列にDatePeriodという名前の列が追加されます。いくつかのことを片付ける手助けに応じて :

おかげ

EDITを これは、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 

希望これはどんな意味があります。

+0

@bluefeetに記載されているコンテンツとともに「2つの個別のクエリ」を投稿してください – Seph

答えて

1

SQLが、ない上で操作を行うために構築されています(もちろん、列を選択しますが、集計の操作が行上のすべてのです)。

これまで最も標準的なアプローチのようなものです:今、あなたはあなたが処理することができますどのように多くの年に制限なしで、記録上の各年の1行を取得します

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

。別のフィールドで既にグループ化している場合は、それは問題ありません。それらのグループのそれぞれの年ごとに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固有の関数で書かれていますが、対応する関数は他のエンジンにも存在しますが、構文は少し異なります。)

関連する問題