90日間何も販売していないディストリビューターを表示するクエリを取得しようとしていますが、取得する問題はNULL値にあります。PostgreSQLはnull値を表示するように照会した場合でも、null値を無視しているようです(または間違った方法で行った可能性があります)。
1000のディストリビューターがあるとしましょう。ただし、このクエリでは1つのディストリビューターしか取得できませんが、過去90日間に任意の金額で販売したディストリビューターを表示するSQLクエリを作成すると、何も販売しなかったディストリビューターがさらに増えるはずです。それは約500を示しています。それで、他の499はどこにあるのだろうか?私が正しく理解していれば、他の499は売り上げがなかったため、すべてのレコードがnullであり、クエリに表示されません。
他のテーブルがnullではない場合に1つのテーブルのnull値を表示する方法を知っている人はいますか?(partnersテーブル(res_partner)はnullではありませんが、sale_orderテーブル(sales)またはオブジェクトはnullですか?(so.id IS NULLのようにフィルタリングしようとしましたが、そのようにして空のクエリを取得します)
私のクエリのコード:
(
SELECT
min(f1.id) as id,
f1.partner as partner,
f1.sum1
FROM
(
SELECT
min(f2.id) as id,
f2.partner as partner,
sum(f2.null_sum) as sum1
FROM
(
SELECT
min(rp.id) as id,
rp.search_name as partner,
CASE
WHEN
sol.price_subtotal IS NULL
THEN
0
ELSE
sol.price_subtotal
END as null_sum
FROM
sale_order as so,
sale_order_line as sol,
res_partner as rp
WHERE
sol.order_id=so.id and
so.partner_id=rp.id
and
rp.distributor=TRUE
and
so.date_order <= now()::timestamp::date
and
so.date_order >= date_trunc('day', now() - '90 day'::interval)::timestamp::date
and
rp.contract_date <= date_trunc('day', now() - '90 day'::interval)::timestamp::date
GROUP BY
partner,
null_sum
)as f2
GROUP BY
partner
) as f1
WHERE
sum1=0
GROUP BY
partner,
sum1
)as fld
編集:2012-09-1811AM。
Postgresqlがこのように動作する理由を理解していると思います。それは時間間隔のためです。そのインバーバルにnull以外の値があるかどうかをチェックします。したがって、そのレコードにはゼロの販売注文があり(nullからゼロに変換されなかった)、null値をチェックする部分がスキップされたため、レコードは1つしか見つかりませんでした。時間間隔を削除すると、何も販売しなかったすべてのディストリビューターが表示されます。しかし、何らかの理由で時間間隔があると、null値のチェックを停止し、null値のみが存在するかどうかを確認します。
それで、誰かが与えられた間隔でnull値もチェックするようにする方法を知っていますか?..(正確には過去90日間)