Usuário com melhor resposta
Como implementar um select com faixas que se mesclam

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
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
Todas as Respostas
-
-
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
Unchecked5 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 -
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
-
-