>>Veja se isso te resolve
>>select cod_associado, seq_fam, nome, 1 as tipo from associados where 
>>seq_fam = 0 UNION ALL select cod_associado, seq_fam, nome, 2 as tipo 
>>from associados where seq_fam <> 0 order by cod_associado, tipo, nome;
>>Perlo menos no meu teste aqui deu certo.


Boa tarde, Flavio.
Não resolveu porque primeiro vem a ordenação pelo nome do titular e os 
dependentes abaixo.
Com a ajuda do Rafael Fialho eu consegui chegar nesta view:
CREATE OR REPLACE VIEW view_associado_smc AS
WITH associado (ordem, cod_associado, seq_fam, nome, num_convenio, 
cod_proposta, cod_status, dt_nasc, idade) AS
    (
        SELECT 
            CASE WHEN seq_fam = 0 THEN
                rank() OVER (ORDER BY nome)
            ELSE
                NULL
            END AS ordem, 
            cod_associado, 
            seq_fam, 
            nome, 
            num_convenio, 
            cod_proposta,
            cod_status,
            dt_nasc,
            idade
        FROM 
            associado 
        ORDER BY 
            cod_associado,
            seq_fam,
            nome
        
    )

    SELECT 
        CASE WHEN ordem IS NULL THEN

           (SELECT a.ordem FROM associado a 
                WHERE 
                    a.num_convenio = ascd.num_convenio AND 
                    a.cod_proposta = ascd.cod_proposta AND 
                    a.cod_associado = ascd.cod_associado AND 
                    a.seq_fam = 0 AND a.ordem IS NOT NULL)
        ELSE
            ordem
        END as ordem,
        cod_associado,
        seq_fam,
        nome::CHAR(10) AS nome,
        num_convenio,
        cod_proposta,
        cod_status,
        dt_nasc,
        idade
    FROM
        associado ascd
    WHERE 
                    num_convenio = ascd.num_convenio AND 
                    cod_proposta = ascd.cod_proposta AND 
                    cod_associado = ascd.cod_associado AND 
                    seq_fam = ascd.seq_fam
    
    ORDER BY
        1, 
        cod_associado, 
        seq_fam;


Olha o resultado:

select ordem, cod_associado, seq_fam, nome from view_associado_smc where 
num_convenio = 251 limit 10;

1293 414                 0 ABNEIDA DE
1293 414                 1 FABIO ALEX
1293 414                 2 LUIZA DE A
1293 414                 3 IZADORA DE
2018 100289           0 ADAMS MAR
3720 1071               0 ADOLPHO CY
4274 100330           0 ADRIANA LA
4274 100330           1 ALEXANDRE
4274 100330           2 MANUELA L
4274 100330           3 HEITOR LAG

Funcionou mas ficou muito lenta.

Acho que este subselect é o problema: 
           (SELECT a.ordem FROM associado a 
                WHERE 
                    a.num_convenio = ascd.num_convenio AND 
                    a.cod_proposta = ascd.cod_proposta AND 
                    a.cod_associado = ascd.cod_associado AND 
                    a.seq_fam = 0 AND a.ordem IS NOT NULL)

Fiz com Inner Join mas o resultado não foi o mesmo...
Alguma sugestão?

_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a