2017-04-05 4 views
0

これはこのフォーラムの最初の投稿ですので、わかりやすかったり質問の形式が正しくないと謝っています。SQLで2つのテーブルを結合しようとすると問題が発生する

| Date | Year_Part | Month_part | 
31-01-2016  2016   1 
29-02-2016  2016   2 
31-03-2016  2016   3 
30-04-2016  2016   4 
    ...   ...   ... 

このテーブルには、単に最初の列は、各月の最終日である2016年の一年を経る:

は、私は、次の表、TABLE_MONTHSを持っています。

| Date | Year_Part | Month_part | Cumulative_Saved | 
03-01-2016  2016   1    50 
07-03-2016  2016   3    150 
25-03-2016  2016   3    275 
14-07-2016  2016   7    400 
    ...   ...   ... 

このテーブルには、私は私の貯蓄銀行口座にいくらかのお金を入れている各日付と片付け量を示しています

は、私はまた、別のテーブル、TABLE_SAVINGSを持っています。

私は何を後にしていますが、これらの2つのテーブルを結合している、結果のテーブルは次のようになりますよう:

| Date | Year_Part | Month_part | Cumulative_Saved | 
31-01-2016  2016   1    50 
29-02-2016  2016   2    50 
31-03-2016  2016   3    275 
30-04-2016  2016   4    275 
31-05-2016  2016   5    275 
30-06-2016  2016   6    275 
31-07-2016  2016   7    400 
    ...   ...   ... 

基本的には、代わりにちょうど私が私にお金を堆積する際の正確な日付を持っていることの表私の貯蓄口座にどれくらいの金額があるかを月ごとに記録してくれます。

私の問題は、私が望む結果のためにこれら2つのテーブルを結合するロジックを理解することが苦労していることです。この作業を取得しようとしているの多くの試みの後、私が思い付くために管理している「最高」は、

SELECT 
    A.*, 
    MAX(B.Cumulative_Saved) OVER 
     (PARTITION BY B.Month_part ORDER BY B.Month_part ASC) 
FROM 
    TABLE_MONTHS A 
LEFT JOIN 
    TABLE_SAVINGS B 
    ON A.[Date] <= B.[Date] 

をされているが、これはまたから、後の日付にTABLE_MONTHSから以前の日付に参加しますTABLE_SAVINGSでは、TABLE_MONTHSの日付ごとに複数の日付の複数の行が表示されます。

また、Cumulative_Savedフィールドが増えた場合(私のデータではそうではありません)、月の終わりに最も近いデータを持つ行を選択するとは限りません私の最初のテーブルからの日付。

私は本当にこれらに苦しんでいて、答えを感謝しています、私は実際にこれを動作させるための方法を見ることができません。

これが不明な場合は教えてください。私は何を意味するのかを明確にしようとします。

私はNetezzaとSSMSにアクセスできるので、いずれかの回答が最適です。

ありがとうございました。

答えて

0

これは、横方向を使用して、SQL Serverの方が簡単ですが参加:

select tm.*, ts.Cumulative_Saved 
from table_months tm outer apply 
    (select top 1 tm 
     from table_saving ts 
     where ts.date <= tm.date 
     order by ds.date desc 
    ) ts; 

あなたはignore nullslag()を使用してNetezzaの中でこれを行うことができます:

select tm.*, 
     coalesce(ts.Cumulative_Saved, 
       lag(ts.Cumulative_Saved ignore nulls) over (order by tm.date) 
       ) as Cumulative_Saved 
from table_months tm left join 
    (select ts.*, 
      row_number() over (partition by date_trunc('month', ts.date) order by ts.date desc) as seqnum 
     from table_saving ts 
    ) ts 
    on date_trunc('month', ts.date) = date_trunc('month', tm.date) and 
     seqnum = 1; 
+0

完璧、ありがとうゴードン! – EskiJoe

0

SQLは、このような要件に最適なソリューションではありません。私の意見では、副選択(SELECT TOP 1 Cumulative_Saved WHERE ... ORDER BY ...)はトリックを行い、複雑な結合よりもはるかに読みやすいはずです。

関連する問題