none
INSERT de dados evitando os valores DUPLICADOS tratado por CASE. RRS feed

  • Pergunta

  • Boa tarde a todos.

    Estou com uma consulta que será usada como INSERT SELECT, mas estou com 2 problemas na mesma.

    Problema #1.

    É uma consulta de inserção de ocorrências para alunos de acordo com a entrada e saída das catracas, mas fora tantos casos que aplicamos 5 subquerys na consulta para tratativa de cada caso, mas no fim trouxemos o que queriamos como segue a imagem juntamente com uma parte da consulta logo abaixo.

    (SELECT MAX(IDOCORALUNO) FROM SOCORRENCIAALUNO WHERE CODCOLIGADA=1)+ ROW_NUMBER() OVER(PARTITION BY SET5.IDPERLET ORDER BY SET5.RA ASC) 'IDOCORALUNO', SET5.RA, '11' CODOCORRENCIAGRUPO, '144' CODOCORRENCIATIPO, SET5.IDPERLET, GETDATE() 'DATAOCORRENCIA', SET5.A1,SET5.A2,SET5.A3,SET5.A4,SET5.A5,SET5.A6, SET5.DATA_ACESSOCATRACA, '1' DISPONIVELWEB, 'mestre' RECCREATEDBY, GETDATE() RECCREATEDON, 'mestre' RECMODIFIEDBY, GETDATE() RECMODIFIEDON, 'N' RESPONSAVELCIENTE FROM( SELECT DISTINCT SET4.COLIGADA AS CODCOLIGADA, NULL AS IDOCORALUNO, SET4.RA, '11' CODOCORRENCIAGRUPO, '144' CODOCORRENCIATIPO, SET4.IDPERLET, GETDATE() 'DATAOCORRENCIA', ------------------------------ ALUNO FALTOU AO COLEGIO ------------------------------ MAX( CASE WHEN SET4.ENTRADA_ACESSO IS NULL AND SET4.SAIDA_ACESSO IS NULL

    THEN '1 - O ALUNO FALTOU AO COLEGIO ' END) AS 'A1' , ------------------------------------------------------------------------------------- ------------------------------ ALUNO ENTROU NO COLEGIO ------------------------------ MAX( CASE WHEN DATEADD(MINUTE,-6, SET4.ENTRADA_ACESSO) < SET4.HORARIO_INICIAL_AULA

    THEN '2 - ALUNO ENTROU NO COLEGIO' END) AS 'A2' , ------------------------------------------------------------------------------------- ------------------------------ ALUNO ENTROU ATRSADO NO SEGUNDO HORARIO ------------------------------ MAX( CASE WHEN DATEADD(MINUTE,-6, SET4.ENTRADA_ACESSO) > SET4.HORARIO_INICIAL_AULA AND

    SET4.ENTRADA_ACESSO < SET4.HORARIO_FINAL_AULA AND SET4.AULA =02 THEN '3 - ALUNO CHEGOU ATRASADO - ENTROU NO SEGUNDO HORARIO' END) AS 'A3' , ------------------------------------------------------------------------------------- ------------------------------ ALUNO SAIU MAIS SEDO DA AULA ------------------------------ ( CASE WHEN DATEADD(MINUTE,+5,SET4.SAIDA_ACESSO) < SET4.HORARIO_FINAL_AULA AND SET4.ENTRADA_ACESSO IS NOT NULL AND

    SET4.AULA = MAX(SET4.AULA) THEN '4 - ALUNO SAIU MAIS SEDO' END) AS 'A4' , ------------------------------------------------------------------------------------- ------------------------------ AULAS ENCERRAS / ALUNO SAIU DO COLEGIO ------------------------------ ( CASE WHEN DATEADD(MINUTE,+10,SET4.SAIDA_ACESSO) >= SET4.HORARIO_FINAL_AULA AND SET4.ENTRADA_ACESSO IS NOT NULL AND SET4.ENTRADA_ACESSO < SET4.HORARIO_FINAL_AULA AND SET4.AULA = MAX(SET4.AULA) THEN '5 - AULAS ENCERRADAS / SAIU DO COLEGIO' --ELSE -- '10 - LOGICA INCORRENTA, FAVOR VERIFICAR!!!' END) AS 'A5' , ------------------------------------------------------------------------------------- ------------------------------ ALUNO TEVE PROBLEMAS NA MARCAÇÃO DA CATRACA ------------------------------ MAX( CASE WHEN (SET4.ENTRADA_ACESSO IS NULL AND SET4.SAIDA_ACESSO IS NOT NULL) OR (SET4.ENTRADA_ACESSO IS NOT NULL

    AND SET4.SAIDA_ACESSO IS NULL) THEN '6 - ALUNO TEVE PROBLEMAS NA MARCAÇÃO DA CATRACA' END) AS 'A6' ,


    Agora o que queremos nesse caso atraves dessas cases de A1, A2, A3, A4, A5,E A6 é transforma-los em linha, pois será adicionada apenas uma case por coluna com o nome de observação.

    Caso #2

    Logo que transformar as cases, cada uma em linha, estou querendo tratar o insert, um IF NOT EXISTS de acordo com a inserção de ocorrência, pois a consulta será um JOB e ele ficará rodando diariamente, de minuto em minuto, e se um aluno tiver status de entrou logo em seguida ele terá um de saiu mais cedo ou saiu no horario e o insert terá que ser tratado para ignorar os inserts de OBSERVAÇÕES já inseridas, como o exemplo do caso do aluno entrou na escola.

    Obs.: o IF NOT EXISTS não poderá ser tratado pelo IDOCORALUNO, pois o mesmo fora tratado para ser gerado um ID diferente para cada caso do dia. Em suma um insert de acordo com o horario de batida do aluno.


    CharlesTI.


    • Editado CHARLES.PTU domingo, 22 de abril de 2018 21:08
    domingo, 22 de abril de 2018 21:01

Respostas

  • Charles,

    Ok, mas você vai ter que definir um valor para os casos que venha a aparecer Nulo, pois não terá como você transformar o resultado que possa apresentar uma linha com valor nulo em coluna.

    Talvez definir um valor padrão!!!


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta CHARLES.PTU quinta-feira, 26 de abril de 2018 19:29
    quinta-feira, 26 de abril de 2018 12:17

Todas as Respostas

  • Charles,

    Vamos por partes, para transformar estas colunas em linhas uma solução mais tradicional seria o uso do comando Pivot, mas para isso é necessário definir uma possível função de agregação de dados para estabelecer critérios de unicidade dos dados, e como existem alguns valores que estão sendo apresentados como Nulos isso poderá impactar nos seus resultados.

    Qual ou quais seriam os possíveis critérios para definirmos o agrupamento dos seus dados.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    segunda-feira, 23 de abril de 2018 12:32
  • Bom dia Junior.

    realmente percebi isto, sobre os valores nulos.

    Mas para os criterios na verdade é o caso de batida, utilizamos estas cases para simular o caso, vai em sequencia, Vamos pegar a primeira linha no caso. Perceba que este aluno a primeira batida dele foi "2 - ENTRAR NO COLEGÍO" e depois a batida de saída dele foi "5 - AULAS ENCERRADAS / O ALUNO SAIU DA ESCOLA". a base sserá assim de acordo com a batida. Quero pegar e converte-las em linha e em seguida fazer a inserção com condição. Pois o sistema gerar primeiramente a batida, mas depois irá gerar 2 insert um de novo com batida cod 2 e outro novo com cod 5 e neste caso quero a condição para barrar a inserção do cod2 e lançar somente o 5 posteriormente.


    CharlesTI.

    segunda-feira, 23 de abril de 2018 12:51
  • Charles,

    Ok, mas você vai ter que definir um valor para os casos que venha a aparecer Nulo, pois não terá como você transformar o resultado que possa apresentar uma linha com valor nulo em coluna.

    Talvez definir um valor padrão!!!


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta CHARLES.PTU quinta-feira, 26 de abril de 2018 19:29
    quinta-feira, 26 de abril de 2018 12:17
  • Boa tarde Junior.

    Então, depois de tanto insistir com esta consulta resolvemos dividi-la por etapas. trazendo uma case para cada insert.


    CharlesTI.

    quinta-feira, 26 de abril de 2018 19:30