gpt4 book ai didi

PostgreSQL - 获取具有空值的记录

转载 作者:行者123 更新时间:2023-11-29 13:05:57 26 4
gpt4 key购买 nike

我正在尝试获取一个查询,该查询将显示 90 天内没有销售任何东西的分销商,但我遇到的问题是 NULL 值。似乎 PostgreSQL 忽略了空值,即使我查询显示它(或者我可能以错误的方式做到了)。

假设有 1000 个分销商,但是通过这个查询我只能得到 1 个分销商,但是应该有更多的分销商没有销售任何东西,因为如果我编写 SQL 查询来显示最近销售了任意数量的分销商90天,它显示大约500。所以我想知道其他499在哪里?如果我没理解错的话,其他499,没有任何销售,所以所有记录都是空的,查询中没有显示。

有谁知道如何让它显示一个表的空值,而其他表不为空? (比如 partners 表 (res_partner) 不为空,但是 sale_order 表 (sales) 或对象为空?(我也尝试过像 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-18 上午 11 点。

我想我理解为什么 Postgresql 会这样。这是因为时间间隔。它检查该间隔中是否有任何非空值。所以它只找到了一个记录,因为该记录的销售订单为零(它没有从空值转换为零)并且只是跳过了检查空值的部分。如果我删除时间间隔,那么我会看到所有根本没有销售任何东西的分销商。但是由于某种原因,随着时间间隔,它会停止检查空值并查看是否只有空值。

那么有没有人知道如何让它在给定的时间间隔内也检查空值?..(准确地说是过去 90 天)

最佳答案

sum()min() 这样的聚合会忽略 NULL 值。这是 SQL 标准所要求的,我所知道的每个 DBMS 的行为都是如此。

如果您想将 NULL 值视为例如一个零,然后使用这样的东西:

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

但据我了解,您的问题和您的无效查询实际上需要在 res_partner 和销售表之间进行外部联接。

像这样:

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% 确定我是否正确理解了您的问题,但这可能会让您抢先一步。

关于PostgreSQL - 获取具有空值的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12459044/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com