1

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日間)

4

2 に答える 2

2

sum()とのような集合体は値をmin()無視しNULLます。これはSQL標準で要求されており、私が知っているすべてのDBMSはそのように動作します。

NULL値をたとえばゼロとして扱いたい場合は、次のようなものを使用します。

sum(coalesce(f2.null_sum, 0)) as sum1

しかし、私があなたの質問とあなたの無効なクエリを理解している限り、あなたは実際にres_partnerとsalesテーブルの間の外部結合を望んでいます。

このようなもの:

SELECT min(rp.id) as id,
       rp.search_name as partner,
       sum(coalesce(sol.price_subtotal,0)) as price_subtotal
FROM res_partner as rp 
  LEFT JOIN sale_order as so ON so.partner_id=rp.id and rp.distributor=TRUE
  LEFT JOIN sale_order_line as sol ON sol.order_id=so.id 
WHERE so.date_order <= CURRENT_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 rp.search_name

私はあなたの問題を正しく理解したかどうか100%確信していませんが、それはあなたに有利なスタートを与えるかもしれません。

于 2012-09-17T12:52:16.327 に答える
0

サブクエリに名前を付け、col.q1、col.q2などで列を取得して、どの列からどのクエリ/サブクエリを処理しているかを確認してください。たぶんそれはやや単純です。たとえば、NULLのみを含むいくつかの行を1つの行に統合しますか?また、少なくともデバッグの目的では、各クエリ/サブクエリの最後にcount(*)を追加して、結果に返される暗黙的な行数を取得するのが賢明です。正確に何が起こったのかを推測するのは困難です。

于 2012-09-17T12:41:44.233 に答える