none
Gerar consulta separada por horários RRS feed

  • Pergunta

  • Olá a Todos!

    Tenho uma tabela chamada HORÁRIOS com os seguintes campos e dados para exemplo:

    CODIGO NOME OPE QUANTIDADE DATA HORA
    1020 MARCOS TRAVETAR 15 23/06/2022 07:30:32
    3025 JOSÉ CHULIAR 12 23/06/2022 07:11:10
    2223 MARIA CORTAR 20 23/06/2022 07:15:00
    1020 MARCOS TRAVETAR 32 23/06/2022 08:23:52
    3025 JOSE CHULIAR 16 23/06/2022 08:55:01
    1020 MARCOS TRAVETAR 20 23/06/2022 09:16:17
    4025 CARLOS TRAVETAR 14 23/06/2022 10:20:12
    3262 JOÃO ENFESTAR 8 23/06/2022 07:02:30
    4025 CARLOS TRAVETAR 28 23/06/2022 08:10:12
    3262 JOÃO ENFESTAR 56 23/06/2022 11:15:00
    2223 MARIA CORTAR 33 23/06/2022 09:40:23
    3025 JOSE CHULIAR 13 23/06/2022 10:25:26

    Preciso fazer uma consulta em que se totalize por FUNCIONARIO, OPERACAO, DATA E HORA, sendo a HORA se parado por horários(07:00 as 07:59, 08:00 as 08:59, 09:00 as 09:59, 10:00 as 10:59, e assim por diante.

    Alguém saberia como montar essa consulta? 

    quinta-feira, 23 de junho de 2022 14:09

Respostas

  • Boa noite, 

    Claro, tem muitas formas de fazer esse PIVOT (Função nativa fixa, função nativa dinâmica, OUTER APPLY), neste post (2) SQL Server - PIVOT e PIVOT dinâmico | LinkedIn pode lhe ajudar.... 

    Neste exemplo, utilizei a função nativa fixa.

    USE [MASTER]
    GO 
    
    ;WITH TAB_INTERVALO
    AS
    (
    	SELECT T.INTERVALOBASE, TT.INTERVALO, QUOTENAME(TT.INTERVALO) AS 'Q'
    	FROM 
    	(
    	 VALUES ('00'),('01'),('02'),('03'),('04'),('05')
    	       ,('06'),('07'),('08'),('09'),('10'),('11')
    		   ,('12'),('13'),('14'),('15'),('16'),('17')
    		   ,('18'),('19'),('20'),('21'),('22'),('23')
    	) AS T (INTERVALOBASE)
    	CROSS APPLY (SELECT CONCAT(T.INTERVALOBASE, ':00 às ', T.INTERVALOBASE, ':59') AS 'INTERVALO' ) TT
    )
    , TAB_DADOS
    AS
    (
    	SELECT 
    		 T.[CODIGO]
    		,T.[NOME]
    		,T.[OPE]
    		,T.[QUANTIDADE]
    		,CONVERT(DATETIME2, T.[DATAHORA], 120) AS 'DATAHORA'
    		,CONVERT(DATE, T.[DATAHORA], 120) AS 'DATA'
    		,CONVERT(TIME, T.[DATAHORA], 120) AS 'HORA'
    		,S.HORA_STR
    		,I.INTERVALO
    	FROM
    	( VALUES 
    		 (1020,'MARCOS' ,'TRAVETAR' ,	15,	'2022-06-23 07:30:32')
    		,(3025,'JOSÉ'   ,'CHULIAR'  ,	12,	'2022-06-23 07:11:10')
    		,(3025,'JOSÉ'   ,'CHULIAR'  ,	15,	'2022-06-23 07:30:10')
    		,(3025,'JOSÉ'   ,'CHULIAR'  ,	9,	'2022-06-23 07:50:10')
    		,(2223,'MARIA'  ,'CORTAR'   ,	20,	'2022-06-23 07:15:00')
    		,(1020,'MARCOS' ,'TRAVETAR' ,	32,	'2022-06-23 08:23:52')
    		,(3025,'JOSE'   ,'CHULIAR'  ,	16,	'2022-06-23 08:55:01')
    		,(1020,'MARCOS' ,'TRAVETAR' ,	20,	'2022-06-23 09:16:17')
    		,(4025,'CARLOS' ,'TRAVETAR' ,	14,	'2022-06-23 10:20:12')
    		,(3262,'JOÃO'   ,'ENFESTAR' ,	8,	'2022-06-23 07:02:30')
    		,(4025,'CARLOS' ,'TRAVETAR' ,	28,	'2022-06-23 08:10:12')
    		,(3262,'JOÃO'   ,'ENFESTAR' ,	56,	'2022-06-23 11:15:00')
    		,(2223,'MARIA'  ,'CORTAR'   ,	33,	'2022-06-23 09:40:23')
    		,(3025,'JOSE'   ,'CHULIAR'  ,	13,	'2022-06-23 10:25:26')
    	) AS T ([CODIGO],[NOME],[OPE],[QUANTIDADE],[DATAHORA])
    	CROSS APPLY (SELECT FORMAT(CONVERT(DATETIME2, T.[DATAHORA], 120), 'HH') AS 'HORA_STR') S 
    	CROSS APPLY (SELECT CONCAT(S.HORA_STR, ':00 às ', S.HORA_STR, ':59') AS 'INTERVALO' ) I 
    )
    , TAB_DADOS_AGRUPADOS 
    AS
    (
    	SELECT
    		 I.INTERVALO
    		,T.CODIGO
    		,T.NOME
    		,T.OPE
    		,SUM(ISNULL(T.QUANTIDADE,0)) AS 'QUANTIDADE'
    	FROM TAB_INTERVALO I 
    	LEFT JOIN TAB_DADOS T ON (I.INTERVALO = T.INTERVALO)
    	GROUP BY 
    		 I.INTERVALO
    		,T.CODIGO
    		,T.NOME
    		,T.OPE
    )
    SELECT
    	 CODIGO
    	,NOME
    	,OPE
    	,ISNULL([00:00 às 00:59],0) AS '00:00 às 00:59'
    	,ISNULL([01:00 às 01:59],0) AS '01:00 às 01:59'
    	,ISNULL([02:00 às 02:59],0) AS '02:00 às 02:59'
    	,ISNULL([03:00 às 03:59],0) AS '03:00 às 03:59'
    	,ISNULL([04:00 às 04:59],0) AS '04:00 às 04:59'
    	,ISNULL([05:00 às 05:59],0) AS '05:00 às 05:59'
    	,ISNULL([06:00 às 06:59],0) AS '06:00 às 06:59'
    	,ISNULL([07:00 às 07:59],0) AS '07:00 às 07:59'
    	,ISNULL([08:00 às 08:59],0) AS '08:00 às 08:59'
    	,ISNULL([09:00 às 09:59],0) AS '09:00 às 09:59'
    	,ISNULL([10:00 às 10:59],0) AS '10:00 às 10:59'
    	,ISNULL([11:00 às 11:59],0) AS '11:00 às 11:59'
    	,ISNULL([12:00 às 12:59],0) AS '12:00 às 12:59'
    	,ISNULL([13:00 às 13:59],0) AS '13:00 às 13:59'
    	,ISNULL([14:00 às 14:59],0) AS '14:00 às 14:59'
    	,ISNULL([15:00 às 15:59],0) AS '15:00 às 15:59'
    	,ISNULL([16:00 às 16:59],0) AS '16:00 às 16:59'
    	,ISNULL([17:00 às 17:59],0) AS '17:00 às 17:59'
    	,ISNULL([18:00 às 18:59],0) AS '18:00 às 18:59'
    	,ISNULL([19:00 às 19:59],0) AS '19:00 às 19:59'
    	,ISNULL([20:00 às 20:59],0) AS '20:00 às 20:59'
    	,ISNULL([21:00 às 21:59],0) AS '21:00 às 21:59'
    	,ISNULL([22:00 às 22:59],0) AS '22:00 às 22:59'
    	,ISNULL([23:00 às 23:59],0) AS '23:00 às 23:59'
    FROM TAB_DADOS_AGRUPADOS T 
    PIVOT 
    (
    	SUM(T.QUANTIDADE) FOR T.INTERVALO IN 
    	(
    		 [00:00 às 00:59]
    		,[01:00 às 01:59]
    		,[02:00 às 02:59]
    		,[03:00 às 03:59]
    		,[04:00 às 04:59]
    		,[05:00 às 05:59]
    		,[06:00 às 06:59]
    		,[07:00 às 07:59]
    		,[08:00 às 08:59]
    		,[09:00 às 09:59]
    		,[10:00 às 10:59]
    		,[11:00 às 11:59]
    		,[12:00 às 12:59]
    		,[13:00 às 13:59]
    		,[14:00 às 14:59]
    		,[15:00 às 15:59]
    		,[16:00 às 16:59]
    		,[17:00 às 17:59]
    		,[18:00 às 18:59]
    		,[19:00 às 19:59]
    		,[20:00 às 20:59]
    		,[21:00 às 21:59]
    		,[22:00 às 22:59]
    		,[23:00 às 23:59]
    	)
    ) P
    WHERE CODIGO IS NOT NULL 
    
    
    
    
    

    Abraços.

    sexta-feira, 24 de junho de 2022 01:25
  • Luis, muito obrigado. Vou testar aqui e logo lhe respondo.

    vlw...

    sexta-feira, 24 de junho de 2022 17:53

Todas as Respostas

  • Boa tarde!

    Segue uma possível solução, dentro do da interpretação do seu post! 

    USE [MASTER]
    GO 
    
    ;WITH TAB_DADOS
    AS
    (
    	SELECT 
    		 T.[CODIGO]
    		,T.[NOME]
    		,T.[OPE]
    		,T.[QUANTIDADE]
    		,CONVERT(DATETIME2, T.[DATAHORA], 120) AS 'DATAHORA'
    		,CONVERT(DATE, T.[DATAHORA], 120) AS 'DATA'
    		,CONVERT(TIME, T.[DATAHORA], 120) AS 'HORA'
    		,S.HORA_STR
    		,I.INTERVALO
    	FROM
    	( VALUES 
    		 (1020,'MARCOS' ,'TRAVETAR' ,	15,	'2022-06-23 07:30:32')
    		,(3025,'JOSÉ'   ,'CHULIAR'  ,	12,	'2022-06-23 07:11:10')
    		,(3025,'JOSÉ'   ,'CHULIAR'  ,	15,	'2022-06-23 07:30:10')
    		,(3025,'JOSÉ'   ,'CHULIAR'  ,	9,	'2022-06-23 07:50:10')
    		,(2223,'MARIA'  ,'CORTAR'   ,	20,	'2022-06-23 07:15:00')
    		,(1020,'MARCOS' ,'TRAVETAR' ,	32,	'2022-06-23 08:23:52')
    		,(3025,'JOSE'   ,'CHULIAR'  ,	16,	'2022-06-23 08:55:01')
    		,(1020,'MARCOS' ,'TRAVETAR' ,	20,	'2022-06-23 09:16:17')
    		,(4025,'CARLOS' ,'TRAVETAR' ,	14,	'2022-06-23 10:20:12')
    		,(3262,'JOÃO'   ,'ENFESTAR' ,	8,	'2022-06-23 07:02:30')
    		,(4025,'CARLOS' ,'TRAVETAR' ,	28,	'2022-06-23 08:10:12')
    		,(3262,'JOÃO'   ,'ENFESTAR' ,	56,	'2022-06-23 11:15:00')
    		,(2223,'MARIA'  ,'CORTAR'   ,	33,	'2022-06-23 09:40:23')
    		,(3025,'JOSE'   ,'CHULIAR'  ,	13,	'2022-06-23 10:25:26')
    	) AS T ([CODIGO],[NOME],[OPE],[QUANTIDADE],[DATAHORA])
    	CROSS APPLY (SELECT FORMAT(CONVERT(DATETIME2, T.[DATAHORA], 120), 'HH') AS 'HORA_STR') S 
    	CROSS APPLY (SELECT CONCAT(S.HORA_STR, ':00 às ', S.HORA_STR, ':59') AS 'INTERVALO' ) I 
    )
    SELECT 
    	 T.CODIGO
    	,T.NOME
    	,T.OPE
    	,T.INTERVALO
    	,SUM(T.QUANTIDADE) AS 'QUANTIDADE'
    FROM TAB_DADOS T
    GROUP BY 
    	 T.CODIGO
    	,T.NOME
    	,T.OPE
    	,T.INTERVALO
    
    

    Espero que lhe ajude! 

    Abraços.

    quinta-feira, 23 de junho de 2022 15:48
  • Boa tarde, obrigado pela resposta.

    Eu necessito que o script retorne a consulta dessa forma (se possível):

    CODIGO NOME OPE DATA 07:00 AS 07:59 08:00 AS 08:59 09:00 AS 09:59 10:00 AS 10:59 11:00 AS 11:59
    3025 JOSÉ CHULIAR 23/06/2022   12 16 13 0 0
    2223 MARIA CORTAR 23/06/2022     20 0 33 0 0
    3262 JOÃO ENFESTAR 23/06/2022     8 0 0 0 56
    1020 MARCOS TRAVETAR 23/06/2022   15 32 20 0 0
    4025 CARLOS TRAVETAR 23/06/2022     0 28 0 14 0

    Se vocês puderem me auxiliar ficarei agradecido.

    quinta-feira, 23 de junho de 2022 19:08
  • Boa noite, 

    Claro, tem muitas formas de fazer esse PIVOT (Função nativa fixa, função nativa dinâmica, OUTER APPLY), neste post (2) SQL Server - PIVOT e PIVOT dinâmico | LinkedIn pode lhe ajudar.... 

    Neste exemplo, utilizei a função nativa fixa.

    USE [MASTER]
    GO 
    
    ;WITH TAB_INTERVALO
    AS
    (
    	SELECT T.INTERVALOBASE, TT.INTERVALO, QUOTENAME(TT.INTERVALO) AS 'Q'
    	FROM 
    	(
    	 VALUES ('00'),('01'),('02'),('03'),('04'),('05')
    	       ,('06'),('07'),('08'),('09'),('10'),('11')
    		   ,('12'),('13'),('14'),('15'),('16'),('17')
    		   ,('18'),('19'),('20'),('21'),('22'),('23')
    	) AS T (INTERVALOBASE)
    	CROSS APPLY (SELECT CONCAT(T.INTERVALOBASE, ':00 às ', T.INTERVALOBASE, ':59') AS 'INTERVALO' ) TT
    )
    , TAB_DADOS
    AS
    (
    	SELECT 
    		 T.[CODIGO]
    		,T.[NOME]
    		,T.[OPE]
    		,T.[QUANTIDADE]
    		,CONVERT(DATETIME2, T.[DATAHORA], 120) AS 'DATAHORA'
    		,CONVERT(DATE, T.[DATAHORA], 120) AS 'DATA'
    		,CONVERT(TIME, T.[DATAHORA], 120) AS 'HORA'
    		,S.HORA_STR
    		,I.INTERVALO
    	FROM
    	( VALUES 
    		 (1020,'MARCOS' ,'TRAVETAR' ,	15,	'2022-06-23 07:30:32')
    		,(3025,'JOSÉ'   ,'CHULIAR'  ,	12,	'2022-06-23 07:11:10')
    		,(3025,'JOSÉ'   ,'CHULIAR'  ,	15,	'2022-06-23 07:30:10')
    		,(3025,'JOSÉ'   ,'CHULIAR'  ,	9,	'2022-06-23 07:50:10')
    		,(2223,'MARIA'  ,'CORTAR'   ,	20,	'2022-06-23 07:15:00')
    		,(1020,'MARCOS' ,'TRAVETAR' ,	32,	'2022-06-23 08:23:52')
    		,(3025,'JOSE'   ,'CHULIAR'  ,	16,	'2022-06-23 08:55:01')
    		,(1020,'MARCOS' ,'TRAVETAR' ,	20,	'2022-06-23 09:16:17')
    		,(4025,'CARLOS' ,'TRAVETAR' ,	14,	'2022-06-23 10:20:12')
    		,(3262,'JOÃO'   ,'ENFESTAR' ,	8,	'2022-06-23 07:02:30')
    		,(4025,'CARLOS' ,'TRAVETAR' ,	28,	'2022-06-23 08:10:12')
    		,(3262,'JOÃO'   ,'ENFESTAR' ,	56,	'2022-06-23 11:15:00')
    		,(2223,'MARIA'  ,'CORTAR'   ,	33,	'2022-06-23 09:40:23')
    		,(3025,'JOSE'   ,'CHULIAR'  ,	13,	'2022-06-23 10:25:26')
    	) AS T ([CODIGO],[NOME],[OPE],[QUANTIDADE],[DATAHORA])
    	CROSS APPLY (SELECT FORMAT(CONVERT(DATETIME2, T.[DATAHORA], 120), 'HH') AS 'HORA_STR') S 
    	CROSS APPLY (SELECT CONCAT(S.HORA_STR, ':00 às ', S.HORA_STR, ':59') AS 'INTERVALO' ) I 
    )
    , TAB_DADOS_AGRUPADOS 
    AS
    (
    	SELECT
    		 I.INTERVALO
    		,T.CODIGO
    		,T.NOME
    		,T.OPE
    		,SUM(ISNULL(T.QUANTIDADE,0)) AS 'QUANTIDADE'
    	FROM TAB_INTERVALO I 
    	LEFT JOIN TAB_DADOS T ON (I.INTERVALO = T.INTERVALO)
    	GROUP BY 
    		 I.INTERVALO
    		,T.CODIGO
    		,T.NOME
    		,T.OPE
    )
    SELECT
    	 CODIGO
    	,NOME
    	,OPE
    	,ISNULL([00:00 às 00:59],0) AS '00:00 às 00:59'
    	,ISNULL([01:00 às 01:59],0) AS '01:00 às 01:59'
    	,ISNULL([02:00 às 02:59],0) AS '02:00 às 02:59'
    	,ISNULL([03:00 às 03:59],0) AS '03:00 às 03:59'
    	,ISNULL([04:00 às 04:59],0) AS '04:00 às 04:59'
    	,ISNULL([05:00 às 05:59],0) AS '05:00 às 05:59'
    	,ISNULL([06:00 às 06:59],0) AS '06:00 às 06:59'
    	,ISNULL([07:00 às 07:59],0) AS '07:00 às 07:59'
    	,ISNULL([08:00 às 08:59],0) AS '08:00 às 08:59'
    	,ISNULL([09:00 às 09:59],0) AS '09:00 às 09:59'
    	,ISNULL([10:00 às 10:59],0) AS '10:00 às 10:59'
    	,ISNULL([11:00 às 11:59],0) AS '11:00 às 11:59'
    	,ISNULL([12:00 às 12:59],0) AS '12:00 às 12:59'
    	,ISNULL([13:00 às 13:59],0) AS '13:00 às 13:59'
    	,ISNULL([14:00 às 14:59],0) AS '14:00 às 14:59'
    	,ISNULL([15:00 às 15:59],0) AS '15:00 às 15:59'
    	,ISNULL([16:00 às 16:59],0) AS '16:00 às 16:59'
    	,ISNULL([17:00 às 17:59],0) AS '17:00 às 17:59'
    	,ISNULL([18:00 às 18:59],0) AS '18:00 às 18:59'
    	,ISNULL([19:00 às 19:59],0) AS '19:00 às 19:59'
    	,ISNULL([20:00 às 20:59],0) AS '20:00 às 20:59'
    	,ISNULL([21:00 às 21:59],0) AS '21:00 às 21:59'
    	,ISNULL([22:00 às 22:59],0) AS '22:00 às 22:59'
    	,ISNULL([23:00 às 23:59],0) AS '23:00 às 23:59'
    FROM TAB_DADOS_AGRUPADOS T 
    PIVOT 
    (
    	SUM(T.QUANTIDADE) FOR T.INTERVALO IN 
    	(
    		 [00:00 às 00:59]
    		,[01:00 às 01:59]
    		,[02:00 às 02:59]
    		,[03:00 às 03:59]
    		,[04:00 às 04:59]
    		,[05:00 às 05:59]
    		,[06:00 às 06:59]
    		,[07:00 às 07:59]
    		,[08:00 às 08:59]
    		,[09:00 às 09:59]
    		,[10:00 às 10:59]
    		,[11:00 às 11:59]
    		,[12:00 às 12:59]
    		,[13:00 às 13:59]
    		,[14:00 às 14:59]
    		,[15:00 às 15:59]
    		,[16:00 às 16:59]
    		,[17:00 às 17:59]
    		,[18:00 às 18:59]
    		,[19:00 às 19:59]
    		,[20:00 às 20:59]
    		,[21:00 às 21:59]
    		,[22:00 às 22:59]
    		,[23:00 às 23:59]
    	)
    ) P
    WHERE CODIGO IS NOT NULL 
    
    
    
    
    

    Abraços.

    sexta-feira, 24 de junho de 2022 01:25
  • Luis, muito obrigado. Vou testar aqui e logo lhe respondo.

    vlw...

    sexta-feira, 24 de junho de 2022 17:53
  • Olá Marcos,

     

    Alguma novidade sobre sua consulta?

     

    A resposta foi dada pelo Luis?

     

    Obrigado por utilizar os fóruns MSDN.

     ____________________________

     

    Lembre-se de "Marcar como Respostas" respostas que resolveram seu problema, é uma forma comum de reconhecer aqueles que ajudaram, e torna mais fácil para os outros visitantes encontrar a solução mais tarde.

     

    Se você tiver algum elogio ou reclamação sobre o suporte MSDN, sinta-se à vontade para contatar MSDNFSF@microsoft.com.


    Jeremy Arias

    sexta-feira, 24 de junho de 2022 21:45
  • Olá Luis, tudo jóia.

    Gostei muito desse exemplo, me ajudou muito.

    Agora eu necessito de algo um pouco mais complicado, se vc puder me ajudar eu lhe agradeço.

    Tenho 3 tabelas PRODUCAO, OPERACAO e FUNCIONARIOS

    Tabela PRODUCAO possui os seguintes campos: DATA, CODIGO_FUNCI, CODIGO_OPE, QTD, HORA

    Tabela OPERACAO possui os seguintes campos: CODIGO_OPE, DESCRICAO

    Tabela FUNCIONARIOS possui os seguintes campos: CODIGO_FUNCI, NOME

    A consulta seria quase igual a anterior:

    FUNCIONARIO OPERAÇÃO DATA           07:00 AS 07:59 08:00 AS 08:59 09:00 AS 09:59 10:00 AS 10:59 11:00 AS 11:59
    MARCOS TRAVETAR 23/06/2022     15

    É possível fazer o PIVOT junto com um INNER JOIN?

    sábado, 25 de junho de 2022 12:39
  • Marcos, boa tarde!

    Consegue sim, porém tens que duas coisa a observar!

    1º - Quando acontece o PIVOT os campos são chamados do ALIAS do PIVOT, vide exemplo abaixo, podes achar estranho, neste exemplo a chamada do primeiro campo do SELECT é P.[CODIGO], não sei exatamente o motivo desse comportamento, acredito que seja algo relacionado a lógica dessa função, pode ser que o pessoal possam nos explicar.

    2º - Ordenação, ligado a questão superior, o JOIN pode ser utilizado após o PIVOT, vide exemplo...

    Diante disso, posso afirmar que é possível! Mas, particularmente, utilizo sempre CTE's para resolver essas questões.

    Exemplo.

    USE [MASTER]
    GO 
    
    ;WITH TAB_INTERVALO
    AS
    (
    	SELECT T.INTERVALOBASE, TT.INTERVALO, QUOTENAME(TT.INTERVALO) AS 'Q'
    	FROM 
    	(
    	 VALUES ('00'),('01'),('02'),('03'),('04'),('05')
    	       ,('06'),('07'),('08'),('09'),('10'),('11')
    		   ,('12'),('13'),('14'),('15'),('16'),('17')
    		   ,('18'),('19'),('20'),('21'),('22'),('23')
    	) AS T (INTERVALOBASE)
    	CROSS APPLY (SELECT CONCAT(T.INTERVALOBASE, ':00 às ', T.INTERVALOBASE, ':59') AS 'INTERVALO' ) TT
    )
    , TAB_CODIGO
    AS
    (
    	SELECT CODIGO, LETRA
    	FROM (VALUES (1020,'A'),(2223,'B'),(3025,'C'),(4025,'D')) AS T (CODIGO, LETRA)
    )
    , TAB_DADOS
    AS
    (
    	SELECT 
    		 T.[CODIGO]
    		,T.[NOME]
    		,T.[OPE]
    		,T.[QUANTIDADE]
    		,CONVERT(DATETIME2, T.[DATAHORA], 120) AS 'DATAHORA'
    		,CONVERT(DATE, T.[DATAHORA], 120) AS 'DATA'
    		,CONVERT(TIME, T.[DATAHORA], 120) AS 'HORA'
    		,S.HORA_STR
    		,I.INTERVALO
    	FROM
    	( VALUES 
    		 (1020,'MARCOS' ,'TRAVETAR' ,	15,	'2022-06-23 07:30:32')
    		,(3025,'JOSÉ'   ,'CHULIAR'  ,	12,	'2022-06-23 07:11:10')
    		,(3025,'JOSÉ'   ,'CHULIAR'  ,	15,	'2022-06-23 07:30:10')
    		,(3025,'JOSÉ'   ,'CHULIAR'  ,	9,	'2022-06-23 07:50:10')
    		,(2223,'MARIA'  ,'CORTAR'   ,	20,	'2022-06-23 07:15:00')
    		,(1020,'MARCOS' ,'TRAVETAR' ,	32,	'2022-06-23 08:23:52')
    		,(3025,'JOSE'   ,'CHULIAR'  ,	16,	'2022-06-23 08:55:01')
    		,(1020,'MARCOS' ,'TRAVETAR' ,	20,	'2022-06-23 09:16:17')
    		,(4025,'CARLOS' ,'TRAVETAR' ,	14,	'2022-06-23 10:20:12')
    		,(3262,'JOÃO'   ,'ENFESTAR' ,	8,	'2022-06-23 07:02:30')
    		,(4025,'CARLOS' ,'TRAVETAR' ,	28,	'2022-06-23 08:10:12')
    		,(3262,'JOÃO'   ,'ENFESTAR' ,	56,	'2022-06-23 11:15:00')
    		,(2223,'MARIA'  ,'CORTAR'   ,	33,	'2022-06-23 09:40:23')
    		,(3025,'JOSE'   ,'CHULIAR'  ,	13,	'2022-06-23 10:25:26')
    	) AS T ([CODIGO],[NOME],[OPE],[QUANTIDADE],[DATAHORA])
    	CROSS APPLY (SELECT FORMAT(CONVERT(DATETIME2, T.[DATAHORA], 120), 'HH') AS 'HORA_STR') S 
    	CROSS APPLY (SELECT CONCAT(S.HORA_STR, ':00 às ', S.HORA_STR, ':59') AS 'INTERVALO' ) I 
    )
    , TAB_DADOS_AGRUPADOS 
    AS
    (
    	SELECT
    		 I.INTERVALO
    		,T.CODIGO
    		,T.NOME
    		,T.OPE
    		,SUM(ISNULL(T.QUANTIDADE,0)) AS 'QUANTIDADE'
    	FROM TAB_INTERVALO I 
    	LEFT JOIN TAB_DADOS T ON (I.INTERVALO = T.INTERVALO)
    	GROUP BY 
    		 I.INTERVALO
    		,T.CODIGO
    		,T.NOME
    		,T.OPE
    )
    SELECT
    	 P.[CODIGO]
    	,P.[NOME]
    	,P.[OPE]
    	,C.LETRA
    	,ISNULL(P.[00:00 às 00:59],0) AS '00:00 às 00:59'
    	,ISNULL(P.[01:00 às 01:59],0) AS '01:00 às 01:59'
    	,ISNULL(P.[02:00 às 02:59],0) AS '02:00 às 02:59'
    	,ISNULL(P.[03:00 às 03:59],0) AS '03:00 às 03:59'
    	,ISNULL(P.[04:00 às 04:59],0) AS '04:00 às 04:59'
    	,ISNULL(P.[05:00 às 05:59],0) AS '05:00 às 05:59'
    	,ISNULL(P.[06:00 às 06:59],0) AS '06:00 às 06:59'
    	,ISNULL(P.[07:00 às 07:59],0) AS '07:00 às 07:59'
    	,ISNULL(P.[08:00 às 08:59],0) AS '08:00 às 08:59'
    	,ISNULL(P.[09:00 às 09:59],0) AS '09:00 às 09:59'
    	,ISNULL(P.[10:00 às 10:59],0) AS '10:00 às 10:59'
    	,ISNULL(P.[11:00 às 11:59],0) AS '11:00 às 11:59'
    	,ISNULL(P.[12:00 às 12:59],0) AS '12:00 às 12:59'
    	,ISNULL(P.[13:00 às 13:59],0) AS '13:00 às 13:59'
    	,ISNULL(P.[14:00 às 14:59],0) AS '14:00 às 14:59'
    	,ISNULL(P.[15:00 às 15:59],0) AS '15:00 às 15:59'
    	,ISNULL(P.[16:00 às 16:59],0) AS '16:00 às 16:59'
    	,ISNULL(P.[17:00 às 17:59],0) AS '17:00 às 17:59'
    	,ISNULL(P.[18:00 às 18:59],0) AS '18:00 às 18:59'
    	,ISNULL(P.[19:00 às 19:59],0) AS '19:00 às 19:59'
    	,ISNULL(P.[20:00 às 20:59],0) AS '20:00 às 20:59'
    	,ISNULL(P.[21:00 às 21:59],0) AS '21:00 às 21:59'
    	,ISNULL(P.[22:00 às 22:59],0) AS '22:00 às 22:59'
    	,ISNULL(P.[23:00 às 23:59],0) AS '23:00 às 23:59'
    FROM TAB_DADOS_AGRUPADOS T 
    PIVOT 
    (
    	SUM(T.QUANTIDADE) FOR T.INTERVALO IN 
    	(
    		 [00:00 às 00:59]
    		,[01:00 às 01:59]
    		,[02:00 às 02:59]
    		,[03:00 às 03:59]
    		,[04:00 às 04:59]
    		,[05:00 às 05:59]
    		,[06:00 às 06:59]
    		,[07:00 às 07:59]
    		,[08:00 às 08:59]
    		,[09:00 às 09:59]
    		,[10:00 às 10:59]
    		,[11:00 às 11:59]
    		,[12:00 às 12:59]
    		,[13:00 às 13:59]
    		,[14:00 às 14:59]
    		,[15:00 às 15:59]
    		,[16:00 às 16:59]
    		,[17:00 às 17:59]
    		,[18:00 às 18:59]
    		,[19:00 às 19:59]
    		,[20:00 às 20:59]
    		,[21:00 às 21:59]
    		,[22:00 às 22:59]
    		,[23:00 às 23:59]
    	)
    ) P
    JOIN TAB_CODIGO C ON (P.[CODIGO] = C.CODIGO)
    WHERE P.[CODIGO] IS NOT NULL 
    

    Abraços.


    sábado, 25 de junho de 2022 20:18