我正在尝试获取一个查询,该查询将显示90天内没有销售任何产品的分销商,但我得到的问题是空值。PostgreSQL似乎忽略了空值,即使是在我查询以显示它时(或者可能是我用错误的方式)。
假设有1000个分销商,但是使用这个查询,我只得到1个分销商,但是应该有更多的分销商没有销售任何东西,因为如果我编写SQL查询来显示在过去90天内以任何数量销售的分销商,它将显示约500个分销商。所以我想知道其他499在哪里?如果我理解正确的话,其他499没有任何销售,所以所有记录都是空的,并且不会显示在查询中。
是否有人知道如何使它显示一个表的空值,而另一个表的关系不为空?(like partners table(res_partner)不为空,但sale_order table(sales)或object为空?(我也尝试过像so.id为空一样进行过滤,但是这样我得到的查询是空的)
我的查询代码:

(
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-18上午11点。
我想我明白为什么Postgresql会这样。因为时间间隔。它检查该inverval中是否有任何非空值。所以它只找到一条记录,因为该记录的销售订单为零(它没有从空转换为零),而检查空值的部分被跳过。如果我删除时间间隔,那么我将看到所有没有销售任何东西的分销商。但由于某些原因,它会停止检查空值,并查看是否只有非空值。
那么有人知道如何在给定的时间间隔内检查空值吗?.. (准确地说,过去90天)

最佳答案

sum()min()这样的聚集会忽略NULL值。这是SQL标准所要求的,我所知道的每一个DBMS的行为都是这样的。
如果要将aNULL值视为例如0,则使用如下方法:

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

我不能百分之百确定我是否正确理解你的问题,但这可能会给你一个先发制人的机会。

09-10 07:58
查看更多