none
Preciso de criar um relatório que me traga o atendimento anterior, do atendimento atual.

    Question

  • Boa tarde!
    Sou iniciante em banco de dados e preciso de um auxilio
    Ex: O cliente estava no setor administrativo, foi criado um numero de atendimento para o mesmo.  O cliente foi direcionado para a sala do almoxarifado, e foi criado um novo atendimento. Ao finalizar o atendimento no almoxarifado, será impresso um relatório do atendimento, onde neste relatório deverá constar o numero do atendimento anterior deste cliente.

    Preciso de criar um relatório que me traga o atendimento anterior, do atendimento atual.


    Emilianni

    Tuesday, August 07, 2012 7:52 PM

Answers

  • Emiliane, o ideal para o seu caso é criar uma consulta recursiva, porém também estou iniciando na área e não lembro de cabeça, além de não estar com o SQL Server instalado na minha máquina para testar erros de sintaxe, porém criei uma procedure na qual você entra com o código do cliente e ela retorna os dados de atendimento, veja se funciona:


    CREATE PROCEDURE stp_atendimentos @cd_paciente int
    AS BEGIN

    WITH cte_atual
    AS
    (
    SELECT TOP 2
                a.cd_atendimento [cod_atendimento_atual],
                pc.cod_paciente    [cod_paciente],
                pc.nm_paciente     [nome_paciente],
                c.cd_convenios      [cod_convenios],
                pe.cd_pedidos        [cod_pedidos]
    FROM
                atendimento a
                JOIN pacientes pc  ON pc.cd_paciente = a.cd_paciente
                  JOIN convenios c ON c.cd_convenio = a.cd_convenio
                     JOIN pedidos p  ON p.cd_atendimento = a.cd_atendimento
    WHERE
                  pc.cod_paciente = @cd_paciente
    ORDER BY a.cd_atendimento DESC 
    )
    , cte_anterior
    AS
    (
    SELECT cod_atendimento_atual  [cod_atendimento_anterior] FROM cte_atual
    ORDER BY 1 DESC
    )
    SELECT TOP 1 cte_atual.cod_atendimento_atual [Código atual],
                             cte_anterior.cod_atendimento_anterior [Código anterior],
                             cte_atual.cod_paciente [Código do paciente],
                             cte_atual.nome_paciente [Nome do paciente],
                             cte_atual.cod_convenios [Código do convênio],
                             cte_atual.cd_pedidos [Código do pedido]
    END;

    -- Execute todo o código acima para criar a procedure
    -- execute o código abaixo para testar a procedure:

    EXEC stp_atendimentos "código do paciente"

    Ex:
    EXEC stp_atendimentos 123

    Vou criar um ambiente de teste quando estiver em uma máquina com SQL Server instalado, caso não funcione ou alguém mais experiente não responda.

    Caso a resposta tenha sido útil por favor marque como útil e me faça feliz :)!

    Wednesday, August 08, 2012 8:40 PM

All replies

  • Emilianni,

    como é a estrutura de tabelas e campos que você está utilizando. você precisa ter um campo chave estrangeira com o ID do cliente em cada tabela administrativo, almocherifado etc ... Existe um campo que armazene o numero de atendimento? Qual a estrutura das tabelas?

    Tuesday, August 07, 2012 8:36 PM
  • Reinaldo

    Tenho as seguintes tabelas envolvidas:
    ATENDIMENTO  - PK = CD_ATENDIMENTO
    PACIENTES - PK = CD_PACIENTE
    CONVENIOS - PK = CD_CONVENIO
    RAIOX - PK = CD_PED_RX
    PED_RX  - PK = CD_PED_RX
    EXAME_RX - PK = CD_EXA_RX

    Fiz os seguintes relacionamento:
    WHERE pacientes.cd_paciente = atendimento.cd_paciente
      AND convenios.cd_convenio = atendimento.cd_convenio
      AND raiox.cd_atendimento = atendimento.cd_atendimento
      AND ped_rx.cd_exa_rx = exame_rx.cd_exa_rx
      AND ped_rx.cd_ped_rx = ped_rx.cd_ped_rx

    Consigo consultar que o cliente TESTE tem os atendimentos 0321 0322 0333, o que eu tenho que fazer para consultar que antes do 0322 exitiu o atendimento 0321?


    Emilianni

    Tuesday, August 07, 2012 9:15 PM
  • Emilianni, fiz um exemplo com as tabelas paciente, atendimento, convenios.

    Fazendo um join entre as tabelas ele traz todos os códigos de atendimento do cliente em sequencia, era isto?

    SELECT
              p.cd_paciente [código do paciente],
              a.cd_atendimento [código do atendimento],
              c.cd_convenios [código do convenio]
    FROM atendimento a 
              JOIN pacientes p ON p.cd_paciente = a.cd_paciente
              JOIN convenios c ON c.cd_convenio = a.cd_convenio
    ORDER BY a.cd_convenios

    -- Não inclui as outras tabelas pois preciso conhecer melhor os campos para fazer o join

    Wednesday, August 08, 2012 4:12 AM
  • Reinaldo, muito obrigada pela query... Desculpa não estar sabendo te explicar com tanta clareza.

    Vou tentar explicar de uma maneira mais clara

        select a.cd_atendimento
                     ,b.cd_paciente
                     ,b.nm_paciente
                     ,c.cd_pedido
          from atendimento a
                     ,pacientes     b
                     ,pedidos        c  
         where a.cd_paciente    = b.cd_paciente
           and a.cd_atendimento = c.cd_atendimento
           and a.cd_atendimento = '915502'
      ORDER BY c.cd_pedido

    Trouxe como resultado 929769/ 929726 / 929696 / 929654 /....

    O Ultimo código é o 929769 certo? Eu quero criar uma query que traga o primeiro código anterior ao 929769 que é o código 929726

    Vou te explicar o meu cenário
    O Cliente foi no consultório A (Criou o atendimento 929726), depois de ser consultado ele será direcionado para o consultório B (Foi criado um novo atendimento 929769), onde realizará um exame e será entregue a ele um protocolo impresso que deverá conter o atendimento do consultório A e do B, é necessário que tenha os dois atendimentos, pois ele retornará ao consultorio A.
    O cliente ja veio várias vezes ao consultório, ele tem diversos códigos de atendimento, e eu não consigo criar uma quey que me traga somente o atendimento anterior


    Emilianni

    Wednesday, August 08, 2012 3:01 PM
  • Emiliane, o ideal para o seu caso é criar uma consulta recursiva, porém também estou iniciando na área e não lembro de cabeça, além de não estar com o SQL Server instalado na minha máquina para testar erros de sintaxe, porém criei uma procedure na qual você entra com o código do cliente e ela retorna os dados de atendimento, veja se funciona:


    CREATE PROCEDURE stp_atendimentos @cd_paciente int
    AS BEGIN

    WITH cte_atual
    AS
    (
    SELECT TOP 2
                a.cd_atendimento [cod_atendimento_atual],
                pc.cod_paciente    [cod_paciente],
                pc.nm_paciente     [nome_paciente],
                c.cd_convenios      [cod_convenios],
                pe.cd_pedidos        [cod_pedidos]
    FROM
                atendimento a
                JOIN pacientes pc  ON pc.cd_paciente = a.cd_paciente
                  JOIN convenios c ON c.cd_convenio = a.cd_convenio
                     JOIN pedidos p  ON p.cd_atendimento = a.cd_atendimento
    WHERE
                  pc.cod_paciente = @cd_paciente
    ORDER BY a.cd_atendimento DESC 
    )
    , cte_anterior
    AS
    (
    SELECT cod_atendimento_atual  [cod_atendimento_anterior] FROM cte_atual
    ORDER BY 1 DESC
    )
    SELECT TOP 1 cte_atual.cod_atendimento_atual [Código atual],
                             cte_anterior.cod_atendimento_anterior [Código anterior],
                             cte_atual.cod_paciente [Código do paciente],
                             cte_atual.nome_paciente [Nome do paciente],
                             cte_atual.cod_convenios [Código do convênio],
                             cte_atual.cd_pedidos [Código do pedido]
    END;

    -- Execute todo o código acima para criar a procedure
    -- execute o código abaixo para testar a procedure:

    EXEC stp_atendimentos "código do paciente"

    Ex:
    EXEC stp_atendimentos 123

    Vou criar um ambiente de teste quando estiver em uma máquina com SQL Server instalado, caso não funcione ou alguém mais experiente não responda.

    Caso a resposta tenha sido útil por favor marque como útil e me faça feliz :)!

    Wednesday, August 08, 2012 8:40 PM
  • Reinaldo

    Ainda não tive tempo para testar o código mais assim que possivel testarei e depois te informo.

    Muito obrigada desde já


    Emilianni

    Friday, August 10, 2012 9:53 PM