Estou tentando fazer uma função com dois nos parâmetros ano e código de uma tabela para retornar a contagem do código e ano fornecido. A tabela é algo assim:
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
);
Consegui retornar a contagem com a função abaixo mas quando dou valores para ano e código em que não existe contagem ele retorna NULL mas deve ser retornado zero, como posso fazer isso?:
CREATE OR REPLACE FUNCTION yearly_orders
(year INT, order_cat orders.code%type) RETURNS INT AS $$
DECLARE
total INT DEFAULT 0;
BEGIN
SELECT COUNT(orders.code) INTO total
FROM orders
WHERE status = 'Requested' AND EXTRACT(YEAR FROM creation) = year::INT AND orders.code = order_cat
GROUP BY year, orders.code;
RETURN total;
END;
$$LANGUAGE plpgsql;
Os dados são algo como:
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);
Isso funcionaria:
A conversão de
integer
paratimestamp
realmente depende do que você passa exatamente e do que isso deveria significar. Você pode quererto_timestamp(_year::text, 'YY')
em vez disso ...Considere a lista no comentário de Akina.
Comece a ler o manual sobre as funções SQL .
Dê uma olhada nas funções PL/pgSQL depois disso.
Visão geral:
Visto que a questão foi reaberta, postarei minha solução também.
Tabela 'encomendas'
Registros
Testando sua declaração
Devoluções
Função
Executando Função
Devoluções
db<>violino
O db<>fiddle para testar isso pode ser encontrado aqui .