Q:

Fazer uma procedure com linguagem SQL que retorne a quantidade de clientes que não tem negócios realizados

Não consigo resolver essa questão, eu quero que ele mostre quantidade de clientes sem repetição de chave primaria, sem negocios realizados e mostre uma aviso se os clientes tem negocios realizados. Apareceu esse erro aqui.

CREATE FUNCTION sem_negocios() RETURNS integer AS 
$$
    SELECT count(*), CASE WHEN identidade NOT IN (SELECT DISTINCT identidade FROM negocio)
        THEN 'negociado'
        ELSE 'nao negociado'
        END AS identidade
    FROM cliente
    GROUP BY CASE 
        WHEN identidade IN (SELECT DISTINCT identidade FROM negocio)
        THEN 'negociado'
        ELSE 'nao negociado'
        END
    ORDER BY identidade;

$$
LANGUAGE 'SQL';

ERRO:  coluna "cliente.identidade" deve aparecer na cláusula GROUP BY ou ser utilizada em uma função de agregação
LINE 3:  SELECT count(*), CASE WHEN identidade NOT IN (SELECT DISTIN...
                                    ^
********** Erro **********
ERRO: coluna "cliente.identidade" deve aparecer na cláusula GROUP BY ou ser utilizada em uma função de agregação
SQL state: 42803
Caracter: 83

A:

Assumindo que seu modelo tenha uma estrutura similar a essa:
CREATE TABLE cliente
(
    cod INTEGER,
    identidade INTEGER
);

CREATE TABLE negocio
(
    cod INTEGER,
    identidade INTEGER
);

Com esses dados:
INSERT INTO cliente( cod, identidade ) VALUES ( 1, 1000 );
INSERT INTO cliente( cod, identidade ) VALUES ( 2, 2000 );
INSERT INTO cliente( cod, identidade ) VALUES ( 3, NULL );
INSERT INTO cliente( cod, identidade ) VALUES ( 4, 4000 );
INSERT INTO cliente( cod, identidade ) VALUES ( 5, NULL );

INSERT INTO negocio( cod, identidade ) VALUES ( 1, 1000 );
INSERT INTO negocio( cod, identidade ) VALUES ( 2, 2000 );
INSERT INTO negocio( cod, identidade ) VALUES ( 3, 4000 );
INSERT INTO negocio( cod, identidade ) VALUES ( 4, 1000 );
INSERT INTO negocio( cod, identidade ) VALUES ( 5, 2000 );
INSERT INTO negocio( cod, identidade ) VALUES ( 6, 4000 );

Sua função ficaria assim:
CREATE OR REPLACE FUNCTION clientes_sem_negocio()
RETURNS INTEGER AS 
$body$
BEGIN
    RETURN(
        SELECT
            DISTINCT count(1)
        FROM
            cliente c
        LEFT JOIN
            negocio n ON ( n.identidade = c.identidade )
        WHERE
            n.identidade IS NULL
    );
END
$body$
LANGUAGE plpgsql;

Testando:
SELECT clientes_sem_negocio() AS qtd;

Saida:

