一切都按预期工作,但如果值为 NULL,函数应返回 0。目前它什么都不返回(请参阅帖子末尾的问题)。
如果没有找到订单,我怎么能返回 0?
“订单”表CREATE TABLE orders (
id INT NOT NULL,
code INT NOT NULL,
service_id INT NOT NULL,
status CHARACTER VARYING(50),
creation TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
status_date TIMESTAMP,
created_user INT
);
记录
INSERT INTO orders
(id, code, service_id, status, creation, status_date, created_user)
VALUES
(100,2394,558151,'Requested','2019-06-16 11:12','2019-06-18 14:08',1),
(100,2394,558151,'Fulfilled','2018-06-16 11:12','2018-06-18 14:08',1),
(100,2394,558151,'Requested','2019-06-16 11:12','2019-06-18 14:08',1),
(100,2395,558152,'Requested','2019-06-16 11:12','2019-06-18 14:08',1),
(100,2396,558153,'Requested','2019-06-16 11:12','2019-06-18 14:08',1),
(100,2394,558151,'Requested','2019-06-16 11:12','2019-06-18 14:08',1);
测试声明
SELECT EXTRACT(YEAR FROM creation) AS year,
orders.code,
COUNT(orders.code)
FROM orders
WHERE status = 'Requested' AND EXTRACT(YEAR FROM creation) = 2019 AND orders.code = 2394
GROUP BY year, orders.code
ORDER BY year ASC
退货
年份 | 代码 | 数数 :--- | ---: | ----: 2019 | 第2394章 3
功能
CREATE OR REPLACE FUNCTION
yearly_orders(inyear numeric DEFAULT 0, incode INT DEFAULT 0)
RETURNS TABLE (retyear numeric, retcode bigint, retcout bigint) AS
$$
DECLARE
retcount int DEFAULT 0;
retcode int DEFAULT 0;
retyear numeric DEFAULT 0;
BEGIN
RETURN QUERY SELECT CAST(EXTRACT(year FROM creation) as numeric),
CAST(orders.code as bigint),
COUNT(orders.code)
FROM orders
WHERE status = 'Requested'
AND EXTRACT(YEAR FROM creation) = inyear
AND orders.code = incode
GROUP BY EXTRACT(year FROM creation), orders.code
ORDER BY retyear ASC;
END;
$$
LANGUAGE plpgsql;
执行功能
select * from yearly_orders(2019, 1194);
返回 <--问题
应该返回退休| 重新编码 | 撤退 ------: | ------: | ------: | |
退休| 重新编码 | 撤退 ------: | ------: | ------: 0 | 0 | 0
db<>小提琴
可以在此处找到尝试此操作的 db<>fiddle 。
代码由用户:15356(这里)
当没有要返回的行时,您希望
GROUP BY
并且COUNT
聚合返回具有零值的行 -GROUP
ing 不会像那样工作。它结合了如果GROUP BY
不存在将返回的行,因此在这种情况下没有行。您可以添加第二个
SELECT
,结合UNION ALL
,返回一行,其中包含inyear, incode, 0
是否有零个匹配行(由子选择计数)。如果有行,则此部分不返回任何内容,如果没有匹配项,则返回指示该内容的行。请注意,这可能效率很低。这实际上很棘手,您可以像示例中那样提出一条消息
db<>在这里摆弄