2009-06-26 17 views
2

私は3つのテーブル3結合やwhere句一緒

bl_main (bl_id UNIQUE, bl_area) 
bl_details (bl_id UNIQUE, name) 
bl_data(bl_id, month, paper_tons, bottles_tons) 

bl_idを持っているが、最後のテーブル内で一意ではありません。同じbl_idの複数の行があります。私は

bl_id | name | bl_area | sum(paper_tons) | sum (bottles_tons) | paper_tons | bottles_tons 

sum(paper_tons)次の方法でデータを取得しようとしています

12月に月のように同じbl_idのためのすべての紙トンの合計を返す必要があります。

以下のクエリを使用すると、結果を除いてすべてのデータを正しく取得できますが、bl_ids(From bl_data table)という複数の出現があります。

SELECT bl_main.bl_id,name,bl_area,sums.SummedPaper, sums.SummedBottles,paper_tons,bottles_tons 
FROM bl_main 
JOIN bl_details ON 
    bl_main.bl_id= bl_details.bl_id 
left outer JOIN bl_data ON 
    bl_data.bl_id= bl_main.bl_id 
left outer JOIN (
    SELECT bl_id, SUM(Paper_tons) As SummedPaper, SUM(bottle_tons) As SummedBottles 
FROM bl_data 

sums.bl_id = bl_main.bl_id

ON bl_id)を合計して、グループに私は繰り返しなしでbl_idsの唯一のユニークな値を取得wanto、それがすべての最大の月があるbl_idが含まれているとはなりません同じbl_idの月。 EXのために

INCORRECT 


**0601** University Hall  75.76 17051 1356 4040 1154 **11**  
**0601** University Hall  75.76 17051 1356 9190 101  **12** 
**0605** UIC Student  22.86 3331 14799 0 356 **8** 

CORRECT 
**0601** University Hall  75.76 17051 1356 9190 101  **12** 
**0605** UIC Student  22.86 3331 14799 0 356 **8** 

私は

WHERE Month = (SELECT MAX(Month) 

を使用して、最大値を得ることができます知っているが、exactltは、私は、クエリでこれを追加する必要がありますし、私は参加定義を変更する必要があります場所。 私はSQLに慣れているので、どんな助けもありがとうございます。前もって感謝します。

+0

投稿を校正し、bl_idとbu_idsをまっすぐにしてください。 –

+0

どのRDBMSを使用していますか? – Quassnoi

+0

生のクエリを書いているという事実に基づいて、私は彼がRDBMSを使用しているとは思わないでしょう – marr75

答えて

0

フォームのサブクエリを使用して、それ自体に対して月含むテーブルを結合することができます。

Select * 
From mytable m 
    Inner Join (Select max(Month) as Month, myId 
       From mytable 
       Group By myId) mnth 
     On mnth.myId = m.myId and mnth.Month = m.Month 
0

はあなたの句

left outer JOIN bl_data ON 
    bl_data.bl_id= bl_main.bl_id 

は、データのためにあなたを選択するために、どの月に指定されていません登録しようpaper_tonsとbottles_tonsで表示しています。

あなたはそれが唯一含まれている最大の月にJOINを更新する可能性があり、これがそうのように、エントリを制限する必要があります。

left outer JOIN (SELECT bl_id, MAX(Month) as Month from bl_data GROUP BY bl_id) as Month 
    ON Month.bl_id = bl_main.bl_id 
left outer JOIN bl_data ON 
    bl_data.bl_id = bl_main.bl_id AND bl_data.Month = Month.bl_Month 
0

を、私はこのクエリを使用すると、

SELECT bl_main.bl_id,name, bl_area, sums.SummedPaper, sums.SummedBottles, paper_tons, bottles_tons 
FROM bl_main 
    JOIN bl_details ON bl_main.bl_id= bl_details.bl_id 
    left outer JOIN bl_data ON bl_data.bl_id= bl_main.bl_id 
    left outer JOIN 
    (
     SELECT bl_id, month, SUM(Paper_tons) As SummedPaper, SUM(bottle_tons) As SummedBottles 
     FROM bl_data 
     WHERE month in 
     (SELECT MAX(month) FROM bl_data GROUP BY bl_id) 
     GROUP BY bl_id, month 
    ) sums ON sums.bl_id = bl_main.bl_id 
+0

これは、合計を正確にも唯一のbl_idsにも渡しません。 –

1

探しているものだと思いますおそらく1つに結合されるべき2つのテーブル(bl_mainbl_details)があります。しかし、それを別にすると、最大月の行を選択するための自己結合サブクエリが必要です。以下の(未テスト)のようなもの:

SELECT bl_main.bl_id, bl_details.name, bl_main.bl_area, sums.sum_paper_tons, 
     sums.sum_bottles_tons, maxmonth.paper_tons, maxmonth.bottles_tons 
FROM bl_main 
INNER JOIN bl_details ON bl_main.bl_id = bl_details.bl_id 
LEFT OUTER JOIN (SELECT bl_id, SUM(paper_tons) AS sum_paper_tons, 
         SUM(bottles_tons) AS sum_bottles_tons 
       FROM bl_data 
       GROUP BY bl_id) sums ON bl_main.bl_id = sums.bl_id 
LEFT OUTER JOIN (SELECT bl_id, paper_tons, bottles_tons 
       FROM bl_data data2 
       INNER JOIN (SELECT bl_id, MAX(month) AS max_month 
          FROM bl_data 
          GROUP BY bl_id) m 
        ON m.bl_id = data2.bl_id 
        AND m.max_month = data2.month) maxmonth 
    ON bl_main.bl_id = maxmonth.bl_id 
+0

ありがとうございます。私は本当に難しいですが、私はクエリを実行することができません。それは "あいまいに定義された列"というエラーを出します。どんな助けもありがとうございます。 –

+0

集約する列と同じ名前の列別名にすることはできますか?私はそれが差別化できると思ったが、おそらく... –

+0

nope。 Dintヘルプ。それでも、 "列はあいまいに定義されています"というエラーが返されます。 お返事ありがとうございました。何が間違っていると思いますか? –

関連する問題