即使完成所有计算,该函数也不会返回数据,并且我可以在控制台中看到信息。
如果尝试创建一个记录变量来存储值并为每一行返回下一个。
CREATE OR REPLACE FUNCTION recompra ()
RETURNS TABLE (
anho INTEGER,
cod_cliente INTEGER,
cliente VARCHAR(255),
cantidad INTEGER,
clasificacion VARCHAR(64)
) AS $$
DECLARE
anho INTEGER;
cod_cliente INTEGER;
cliente VARCHAR(255);
cantidad INTEGER;
clasificacion VARCHAR(64);
anhos_anteriores INTEGER;
BEGIN
FOR anho IN (SELECT DISTINCT(EXTRACT(YEAR FROM v.fecha_factura)) as anhos
FROM ventas_vehiculos as v
GROUP BY anhos
ORDER BY anhos ASC) LOOP
BEGIN
FOR cod_cliente , cliente IN (SELECT d.cod_cliente, CONCAT(TRIM(d.nombre),' ',TRIM(d.apellido))
FROM clientes as d WHERE estado_cliente <> 'Inactivo' LIMIT 10) LOOP
-- TRAE LAS VENTAS POR ANHO
BEGIN
FOR cantidad IN SELECT COUNT(f.nro_factura) FROM ventas_vehiculos as f
WHERE f.cliente = cod_cliente
AND EXTRACT(YEAR FROM f.fecha_factura) =anho LOOP
SELECT COUNT(f.nro_factura) FROM ventas_vehiculos as f
WHERE f.cliente = cod_cliente
AND extract(YEAR FROM f.fecha_factura) < anho INTO anhos_anteriores;
IF (cantidad >0 AND anhos_anteriores > 1) THEN
clasificacion = 'Recompra';
ELSIF (cantidad > 0 AND anhos_anteriores = 0) then
clasificacion = 'Compra';
ELSIF (cantidad =0) THEN
clasificacion = 'No compra';
RAISE NOTICE '% -- % -- % -- % -- % --', anho,cod_cliente,cliente,cantidad,clasificacion;
END IF;
END LOOP; --- cierra loop cantidades por anho
END; -- cierra trae ventas por anho
END LOOP; --- cierra for clientes
END; -- cierra begin clientes
END LOOP; -- CIERRA FOR ANHOS
END;
$$ LANGUAGE plpgsql;
预期产量
year cod_cliente nombre cantidad clasificacion
2018 1234 Juan 12 compra
2016 3232 pedro 1 recompra
答案 0 :(得分:2)
您的代码有很多问题,我将列出我可以立即看到的问题:
您的代码中没有RETURN NEXT
语句。要返回的每一行都必须有一个。
您声明与输出参数同名的局部变量,这将导致名称冲突。不要那样做RETURNS TABLE
子句中的返回参数已经是 PL / pgSQL变量。
您应使用:=
而不是=
进行分配。这是受支持的方法,避免了与比较运算符的混淆。