我有一个表,我想做一个查询,它显示一个产品的库存在一个时期的每一天,而不仅仅是库存移动完成的日期。
我的解决办法是:
SELECT gs::date, COALESCE(moves,0), btb_goods FROM generate_series('2017-10-01','2017-11-30',INTERVAL '1 DAY') AS gs LEFT JOIN (SELECT COALESCE(SUM(btb_menny),0) as moves, btb_goods, btb_date FROM mytable GROUP BY btb_goods, btb_date) AS mozg ON (date(mozg.btb_date) = gs) ORDER BY 1 ASC;
它起作用了。结果是:
2017-11-05 | 0 | |
2017-11-06 | 0 | |
2017-11-07 | 0 | |
2017-11-08 | 54.1 | sugar |
2017-11-09 | 0 | |
2017-11-10 | 0 | |
2017-11-11 | 0 | A要从库存发生之日起滚动结果,如下所示:
2017-11-05 | 0 | |
2017-11-06 | 0 | |
2017-11-07 | 0 | |
2017-11-08 | 54.1 | sugar |
2017-11-09 | 54.1 | sugar |
2017-11-10 | 54.1 | sugar |
2017-11-11 | 54.1 | 我想,我应该以某种方式写WHERE mozg.btb_date ‹ ...
但我不知道如何实施。
提前通知。
发布于 2017-11-21 21:03:16
这假设了很多,如果它不适用于您的真实数据集,我也不会感到震惊,但是它应该对您的示例有效:
with cte as (
SELECT
gs::date, COALESCE(moves,0) as moves, btb_goods
FROM generate_series('2017-10-01','2017-11-30',INTERVAL '1 DAY') AS gs
LEFT JOIN (
SELECT COALESCE(SUM(btb_menny),0) as moves, btb_goods, btb_date
FROM mytable
GROUP BY btb_goods, btb_date) AS mozg
ON (date(mozg.btb_date) = gs)
)
select
gs, sum (moves) over (order by gs) as moves,
max (btb_goods) over (order by gs) as btb_goods
from cte
order by gs这是缺失的(I 认为),当您遇到另一个非空值的记录时,您会做什么,特别是在文本(但也包括数字)上。你想怎么处理?
换句话说,当您的初始查询返回以下内容时,所需的结果是什么:
11/1/2017 0
11/2/2017 12 jelly
11/3/2017 0
11/4/2017 15 jam
11/5/2017 0https://stackoverflow.com/questions/47422004
复制相似问题