我正在尝试获取一个查询,该查询将显示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
我不能百分之百确定我是否正确理解你的问题,但这可能会给你一个先发制人的机会。