none
Como implementar um select com faixas que se mesclam RRS feed

  • Pergunta

  • Bom dia,

    não sei se o título do post é o mais adequado, mas eu preciso que no select abaixo retorne com a classificação PERIODO com todas as possíveis classificações, pois as faixas se interceptam.  Por exemplo: na idade de 12 meses teve ter duas classificações MedoII e Maturidade, na idade de 21 dias deve ter a classificação Transição, Reconhecimento e socialização.

    Abaixo o codigo a ser implementado:

    ALTER PROCEDURE [dbo].[spIdadeListaNomeAnimais] 
    	
    AS
    BEGIN
    	  DECLARE @DataAtual DATE          
           SET @DataAtual = GETDATE()
           
           Select nome, @DataAtual AS data_atual, data_Nasc,
              --    (CONVERT(VARCHAR,DATEDIFF(YEAR,data_Nasc,@DataAtual)) + ' ano(s)')AS 'IDADE_ano', 
    	         -- (CONVERT(VARCHAR,DATEDIFF(MONTH,data_Nasc,@DataAtual)) + ' mes(es)')AS 'IDADE_mes',
    	         --(CONVERT(VARCHAR,DATEDIFF(SECOND,data_Nasc,@DataAtual) / 86400/7) + ' semana(s)')AS 'IDADE_semana',
    			  (CONVERT(VARCHAR,DATEDIFF(YEAR,data_Nasc,@DataAtual)) + ' ano(s)')AS 'Idade(anos)', 
    	          (CONVERT(VARCHAR,DATEDIFF(MONTH,data_Nasc,@DataAtual)) + ' mes(es)')AS 'Idade(meses)',
    	         (CONVERT(VARCHAR,DATEDIFF(SECOND,data_Nasc,@DataAtual) / 86400/7) + ' semana(s)')AS 'Idade(Semanas)',
           CASE
      	          WHEN (DATEDIFF(DAY,data_Nasc,@DataAtual)) >= 0 AND (DATEDIFF(DAY,data_Nasc,@DataAtual)) <= 14 THEN 'Neonatal (nascimento aos 14 dias)'
    	          WHEN (DATEDIFF(DAY,data_Nasc,@DataAtual)) >= 15 AND (DATEDIFF(DAY,data_Nasc,@DataAtual)) <= 21 THEN 'Transição (de 15 a 21 dias)' 
    			  WHEN (DATEDIFF(DAY,data_Nasc,@DataAtual)) >= 21 AND (DATEDIFF(DAY,data_Nasc,@DataAtual)) <= 28 THEN 'Reconhecimento (de 21 a 28 dias)'
    			  WHEN (DATEDIFF(DAY,data_Nasc,@DataAtual)) >= 21 AND (DATEDIFF(DAY,data_Nasc,@DataAtual)) <= 49 THEN 'Socialização com animais (de 21 a 49 dias)' 			 
    			  WHEN (DATEDIFF(DAY,data_Nasc,@DataAtual)) >= 49 AND (DATEDIFF(DAY,data_Nasc,@DataAtual)) <= 84 THEN 'Socializacao com humanos (de 7 a 12 semanas)' 			 
    			  WHEN (DATEDIFF(DAY,data_Nasc,@DataAtual)) >= 56 AND (DATEDIFF(DAY,data_Nasc,@DataAtual)) <= 77 THEN 'Medo I(de 8 a 11 semana)' 
    			  WHEN (DATEDIFF(DAY,data_Nasc,@DataAtual)) >= 91 AND (DATEDIFF(DAY,data_Nasc,@DataAtual)) <= 112 THEN 'Rebeldia ( de 13 a 16 semanas)' 			 
    			  WHEN (DATEDIFF(DAY,data_Nasc,@DataAtual)) >= 120 AND (DATEDIFF(DAY,data_Nasc,@DataAtual)) <= 240 THEN 'Surdez seletiva (4 a 8 meses)'			 
    			  WHEN (DATEDIFF(DAY,data_Nasc,@DataAtual)) >= 180 AND (DATEDIFF(DAY,data_Nasc,@DataAtual)) <= 420 THEN 'Medo II (de 6 as 14 meses)' 
    			  WHEN (DATEDIFF(DAY,data_Nasc,@DataAtual)) >= 365 AND (DATEDIFF(DAY,data_Nasc,@DataAtual)) <= 1460 THEN 'Maturidade (1 a 4 anos)' 
    			  WHEN (DATEDIFF(DAY,data_Nasc,@DataAtual)) >= 1461 THEN 'Senior' 		 
    		END  AS 'PERÍODO'
        From Animal_Companhia 
    	Order by data_Nasc
    END
    

    segunda-feira, 17 de outubro de 2016 10:08

Respostas

  • Usando os dados do seu primeiro select criei esses passos 

    1)

     DECLARE @DataAtual DATE;          
     SET @DataAtual = GETDATE();
    
    
    --Criei uma tabela temporária com os dados de demostração 
    --na sua SP 
    IF ( OBJECT_ID('TEMPDB..#TablePeriodos') IS NOT NULL )
        DROP TABLE #TablePeriodos;	
    
    CREATE TABLE #TablePeriodos
        (
          PeriodoDe INT NOT NULL ,
          PeriodoAte INT NULL ,
          Descricao  varchar(max)
          
        );
     
    --Inserir os dados que vc demostrou,(os intervalos e descrição)
    
     INSERT INTO #TablePeriodos
             ( PeriodoDe, PeriodoAte, Descricao )
     VALUES  ( 0, -- PeriodoDe - int
               14, -- PeriodoAte - int
               'Neonatal (nascimento aos 14 dias)'  -- Descricao - varchar(max)
               ),
    		     ( 15, -- PeriodoDe - int
               21, -- PeriodoAte - int
               'Transição (de 15 a 21 dias)'  -- Descricao - varchar(max)
               ),
    		      ( 21, -- PeriodoDe - int
               28, -- PeriodoAte - int
               'Reconhecimento (de 21 a 28 dias)'  -- Descricao - varchar(max)
               ),
     
                   ( 21, -- PeriodoDe - int
               49, -- PeriodoAte - int
               'Socialização com animais (de 21 a 49 dias)'  -- Descricao - varchar(max)
               ),
    		      ( 49, -- PeriodoDe - int
               84, -- PeriodoAte - int
               'Socializacao com humanos (de 7 a 12 semanas)'  -- Descricao - varchar(max)
               ),
    		     ( 56, -- PeriodoDe - int
               77, -- PeriodoAte - int
               'Medo I(de 8 a 11 semana)'  -- Descricao - varchar(max)
               ),
    		     ( 91, -- PeriodoDe - int
               112, -- PeriodoAte - int
               'Rebeldia ( de 13 a 16 semanas)'  -- Descricao - varchar(max)
               ),
                 ( 120, -- PeriodoDe - int
               240, -- PeriodoAte - int
               'Surdez seletiva (4 a 8 meses)'  -- Descricao - varchar(max)
               ),
    		     ( 180, -- PeriodoDe - int
               420, -- PeriodoAte - int
               'Medo II (de 6 as 14 meses)'  -- Descricao - varchar(max)
               ),
    		       ( 365, -- PeriodoDe - int
               1460, -- PeriodoAte - int
               'Maturidade (1 a 4 anos)'  -- Descricao - varchar(max)
               ),
    		      ( 1461, -- PeriodoDe - int
               99999, -- PeriodoAte - int
               'Senior'  -- Descricao - varchar(max)
               )
    
    
     --Select usando o Tipo XML
    
     SELECT A.Nome ,
            @DataAtual AS data_atual ,
            A.data_Nasc ,
            ( CONVERT(VARCHAR, DATEDIFF(YEAR, A.data_Nasc, @DataAtual))
              + ' ano(s)' ) AS 'Idade(anos)' ,
            ( CONVERT(VARCHAR, DATEDIFF(MONTH, A.data_Nasc, @DataAtual))
              + ' mes(es)' ) AS 'Idade(meses)' ,
            ( CONVERT(VARCHAR, DATEDIFF(SECOND, A.data_Nasc, @DataAtual) / 86400
              / 7) + ' semana(s)' ) AS 'Idade(Semanas)' ,
            SUBSTRING(( SELECT  '/' + P.Descricao AS [text()]
                        FROM    #TablePeriodos P
                        WHERE   DATEDIFF(DAY, A.data_Nasc, @DataAtual) BETWEEN P.PeriodoDe
                                                                  AND
                                                                  P.PeriodoAte
                      FOR
                        XML PATH('')
                      ), 2, 10000) AS 'PERÍODO'
     FROM   dbo.Animal_Companhia A
     ORDER BY A.data_Nasc;


    Wesley Neves


    • Sugerido como Resposta Wesley Neves segunda-feira, 17 de outubro de 2016 11:17
    • Editado Wesley Neves segunda-feira, 17 de outubro de 2016 11:18 comentario
    • Marcado como Resposta Wilson Boris segunda-feira, 17 de outubro de 2016 12:05
    segunda-feira, 17 de outubro de 2016 11:17

Todas as Respostas

  • Bom dia , me passa 5 dados da sua tabela, por favor

    Wesley Neves

    segunda-feira, 17 de outubro de 2016 10:19
  • A tabela:

    id int Unchecked
    cod_Foto int Checked
    data_Cadastro date Checked
    nome nvarchar(50) Checked
    cod_Sexo int Checked
    data_Nasc date Checked
    cod_Especie_Comp int Checked
    cod_Raca int Checked
    pelagem nvarchar(50) Checked
    id_Microchip nvarchar(50) Checked
    num_CIA int Checked
    registro_kenel nvarchar(50) Checked
    pai nvarchar(50) Checked
    mae nvarchar(50) Checked
    cod_Castrado int Checked
    cod_Acesso_Rua int Checked
    cod_Proprietario int Checked
    cod_prop_anterior int Checked
    Unchecked

    5 Registros:

    id cod_Foto data_Cadastro nome cod_Sexo data_Nasc cod_Especie_Comp cod_Raca pelagem id_Microchip num_CIA registro_kenel pai mae cod_Castrado cod_Acesso_Rua cod_Proprietario cod_prop_anterior
    17 15 22/10/2016 Dolantina 1 01/10/2015 1 53 Branca NULL NULL NULL NULL NULL 3 1 15 NULL
    18 16 17/10/2016 Dori 1 19/09/2016 1 81 Dourado NULL NULL NULL NULL NULL 1 1 15 NULL
    19 18 17/10/2016 Charle 1 01/08/2016 1 129 Lisa e Branca NULL NULL NULL NULL NULL 2 2 17 NULL
    20 19 17/10/2016 Manu 1 19/06/2016 1 1 NULL NULL NULL NULL NULL NULL 3 3 1 NULL
    21 20 01/08/2016 Pingo 2 01/07/2015 1 11 Curta, marrom, branca e preta. NULL NULL NULL NULL NULL 1 2 16 NULL

    segunda-feira, 17 de outubro de 2016 11:01
  • Usando os dados do seu primeiro select criei esses passos 

    1)

     DECLARE @DataAtual DATE;          
     SET @DataAtual = GETDATE();
    
    
    --Criei uma tabela temporária com os dados de demostração 
    --na sua SP 
    IF ( OBJECT_ID('TEMPDB..#TablePeriodos') IS NOT NULL )
        DROP TABLE #TablePeriodos;	
    
    CREATE TABLE #TablePeriodos
        (
          PeriodoDe INT NOT NULL ,
          PeriodoAte INT NULL ,
          Descricao  varchar(max)
          
        );
     
    --Inserir os dados que vc demostrou,(os intervalos e descrição)
    
     INSERT INTO #TablePeriodos
             ( PeriodoDe, PeriodoAte, Descricao )
     VALUES  ( 0, -- PeriodoDe - int
               14, -- PeriodoAte - int
               'Neonatal (nascimento aos 14 dias)'  -- Descricao - varchar(max)
               ),
    		     ( 15, -- PeriodoDe - int
               21, -- PeriodoAte - int
               'Transição (de 15 a 21 dias)'  -- Descricao - varchar(max)
               ),
    		      ( 21, -- PeriodoDe - int
               28, -- PeriodoAte - int
               'Reconhecimento (de 21 a 28 dias)'  -- Descricao - varchar(max)
               ),
     
                   ( 21, -- PeriodoDe - int
               49, -- PeriodoAte - int
               'Socialização com animais (de 21 a 49 dias)'  -- Descricao - varchar(max)
               ),
    		      ( 49, -- PeriodoDe - int
               84, -- PeriodoAte - int
               'Socializacao com humanos (de 7 a 12 semanas)'  -- Descricao - varchar(max)
               ),
    		     ( 56, -- PeriodoDe - int
               77, -- PeriodoAte - int
               'Medo I(de 8 a 11 semana)'  -- Descricao - varchar(max)
               ),
    		     ( 91, -- PeriodoDe - int
               112, -- PeriodoAte - int
               'Rebeldia ( de 13 a 16 semanas)'  -- Descricao - varchar(max)
               ),
                 ( 120, -- PeriodoDe - int
               240, -- PeriodoAte - int
               'Surdez seletiva (4 a 8 meses)'  -- Descricao - varchar(max)
               ),
    		     ( 180, -- PeriodoDe - int
               420, -- PeriodoAte - int
               'Medo II (de 6 as 14 meses)'  -- Descricao - varchar(max)
               ),
    		       ( 365, -- PeriodoDe - int
               1460, -- PeriodoAte - int
               'Maturidade (1 a 4 anos)'  -- Descricao - varchar(max)
               ),
    		      ( 1461, -- PeriodoDe - int
               99999, -- PeriodoAte - int
               'Senior'  -- Descricao - varchar(max)
               )
    
    
     --Select usando o Tipo XML
    
     SELECT A.Nome ,
            @DataAtual AS data_atual ,
            A.data_Nasc ,
            ( CONVERT(VARCHAR, DATEDIFF(YEAR, A.data_Nasc, @DataAtual))
              + ' ano(s)' ) AS 'Idade(anos)' ,
            ( CONVERT(VARCHAR, DATEDIFF(MONTH, A.data_Nasc, @DataAtual))
              + ' mes(es)' ) AS 'Idade(meses)' ,
            ( CONVERT(VARCHAR, DATEDIFF(SECOND, A.data_Nasc, @DataAtual) / 86400
              / 7) + ' semana(s)' ) AS 'Idade(Semanas)' ,
            SUBSTRING(( SELECT  '/' + P.Descricao AS [text()]
                        FROM    #TablePeriodos P
                        WHERE   DATEDIFF(DAY, A.data_Nasc, @DataAtual) BETWEEN P.PeriodoDe
                                                                  AND
                                                                  P.PeriodoAte
                      FOR
                        XML PATH('')
                      ), 2, 10000) AS 'PERÍODO'
     FROM   dbo.Animal_Companhia A
     ORDER BY A.data_Nasc;


    Wesley Neves


    • Sugerido como Resposta Wesley Neves segunda-feira, 17 de outubro de 2016 11:17
    • Editado Wesley Neves segunda-feira, 17 de outubro de 2016 11:18 comentario
    • Marcado como Resposta Wilson Boris segunda-feira, 17 de outubro de 2016 12:05
    segunda-feira, 17 de outubro de 2016 11:17
  • Caramba, que trabalheira eu te dei Wesley!

    Muito obrigado GIGANTE, 100% perfeito.

    segunda-feira, 17 de outubro de 2016 12:05
  • Por nada , estamos a disposição :)

    Wesley Neves

    segunda-feira, 17 de outubro de 2016 12:23