私はこのようになりますテーブルを持っている:なぜこの左外部結合クエリが正しく機能しないのですか?
peter=> \d aggregated_accounts_by_month
Table "public.aggregated_accounts_by_month"
Column | Type | Modifiers
-----------+---------+-----------
xtn_month | date |
account | text |
commodity | text |
amount | numeric |
Indexes:
"idx_aggregated_accounts_by_month_account" btree (account)
"idx_aggregated_accounts_by_month_month" btree (xtn_month)
そして、このようになり、別のテーブル:
peter=> \d months
Table "pg_temp_2.months"
Column | Type | Modifiers
-----------+------+-----------
xtn_month | date |
months
はこれを含んでいます
xtn_month
------------
2011-01-01
2011-02-01
2011-03-01
2011-04-01
2011-05-01
2011-06-01
2011-07-01
aggregated_accounts_by_month
は、この関連データが含まれています。
xtn_month | account | amount
------------+---------------+--------
2011-01-01 | Expenses:Fuel | 111.31
2011-02-01 | Expenses:Fuel | 89.29
2011-03-01 | Expenses:Fuel | 97.41
2011-04-01 | Expenses:Fuel | 101.70
2011-05-01 | Expenses:Fuel | 52.9
2011-07-01 | Expenses:Fuel | 49.55
私が実行しようとしているクエリは次のとおりです。
select
months.xtn_month,
account,
amount
from
aggregated_accounts_by_month a
left outer join months on months.xtn_month = a.xtn_month
where
account = 'Expenses:Fuel'
order by
xtn_month;
私はこのクエリがやりたいことは私にこれらの結果を与えている:
xtn_month | account | amount
------------+---------------+--------
2011-01-01 | Expenses:Fuel | 111.31
2011-02-01 | Expenses:Fuel | 89.29
2011-03-01 | Expenses:Fuel | 97.41
2011-04-01 | Expenses:Fuel | 101.70
2011-05-01 | Expenses:Fuel | 52.9
2011-06-01 | Expenses:Fuel |
2011-07-01 | Expenses:Fuel | 49.55
しかし、それは実際に私は、この与えている:
をxtn_month | account | amount
------------+---------------+--------
2011-01-01 | Expenses:Fuel | 111.31
2011-02-01 | Expenses:Fuel | 89.29
2011-03-01 | Expenses:Fuel | 97.41
2011-04-01 | Expenses:Fuel | 101.70
2011-05-01 | Expenses:Fuel | 52.9
2011-07-01 | Expenses:Fuel | 49.55
私は明らかに何か間違っています。何か案は?私はMac OS X 10.6.7でPostgreSQL 9.0.4を実行しています。
編集:これについてもう少し考えた後、私は数ヶ月だけでなく、アカウントに対しても外部結合を残す必要があります。このクエリは、私が欲しいものを正確に行います。それはaccount
欄に記入していなかったことを除いて
select
xtn_month,
account,
coalesce(amount, 0)
from
(
select
xtn_month,
account
from
(
select
distinct xtn_month
from
aggregated_accounts_by_month
) x
cross join
(
select
distinct account
from
aggregated_accounts_by_month
) y
) z
left outer join aggregated_accounts_by_month
using (xtn_month, account)
where
account = 'Expenses:Fuel'
order by
xtn_month;
ypercubeの答えは、ほとんど右ました。もちろん、このクエリはかなり高価ですが、そこにあるそのクロスプロダクトとは何でしょうか。しかし、これは大丈夫です。なぜなら、aggregated_accounts_by_month
は4年以上の間、2000行を少し下回っているからです。
これは完全に機能し、実際に私のクエリが機能しなかった理由を実際に説明します。 'account'カラムは月テーブルにないのでnullになり、' where'節はその行をフィルタリングします。ありがとう! –