Busca lo que quieras

Crear reporte con sql server organizado por horas autocompletando filas

Suponiendo una tabla con esta estructura:

fecha                                Respuesta        
2012/02/01 XX:01            a              
2012/02/01 XX:01            b              
2012/02/01 XX:01            a              
2012/02/01 XX:01            b         
...
...
..
Muchos registros
...
...
Y suponiendo que no hay registros en la hora 2 respuesta b y no hay hora 3 respuesta a
    

Queremos lo siguiente como resultado del Store procedure:

Hora         Respuesta        Cantidad
1             a                              10
1             b                              15
2             a                                4
2             b                               0  <-- fila autocompletada porque no hay registros
3             a                               0  <-- fila autocompletada porque no hay registros
3             b                              6

El procedimiento para hacer una consulta con la cual pueda obtener un reporte por el conteo de filas, y que las horas que no existan en la bd se autocompleten este sería el query:

DECLARE @minHour INT
DECLARE @maxHour INT

DECLARE @DATEFROM DATETIME
SET @DATEFROM = '2013-09-15 00:00:56.330'

DECLARE @DATETO DATETIME
SET @DATETO = '2013-09-15 23:59:56.330'

SELECT TOP 1 @minHour = DATEPART(hh,FechaAAnalizar) FROM TablaReporte OPE
WHERE OPE.FechaAAnalizar > @DATEFROM
and  OPE.FechaAAnalizar < @DATETO
GROUP BY DATEPART(hh,FechaAAnalizar)
ORDER BY DATEPART(hh,FechaAAnalizar) ASC

SELECT TOP 1 @maxHour = DATEPART(hh,FechaAAnalizar) FROM TablaReporte OPE
WHERE OPE.FechaAAnalizar > @DATEFROM
and  OPE.FechaAAnalizar < @DATETO
GROUP BY DATEPART(hh,FechaAAnalizar)
ORDER BY DATEPART(hh,FechaAAnalizar) DESC


--SELECT DATEPART(hh,FechaAAnalizar), idTipoDeRespuesta, count(1) FROM TablaReporte OPE
--WHERE OPE.FechaAAnalizar > @DATEFROM
--and  OPE.FechaAAnalizar < @DATETO
--GROUP BY DATEPART(hh,FechaAAnalizar), idTipoDeRespuesta
--ORDER BY DATEPART(hh,FechaAAnalizar), idTipoDeRespuesta

IF OBJECT_ID('tempdb..#tableHours') IS NOT NULL DROP TABLE #tableHours

;WITH CTE as
(SELECT 1 i UNION ALL
SELECT i+1 i FROM CTE WHERE i < 5)
SELECT DATEPART(HH, DATEADD(HH, @minHour + i, @DATETO)) 'hour' INTO #tableHours from CTE

IF OBJECT_ID('tempdb..#tableTypes') IS NOT NULL DROP TABLE #tableTypes

SELECT idTipoDeRespuesta 'type' INTO #tableTypes FROM TablaReporte OPE
WHERE OPE.FechaAAnalizar > @DATEFROM
and  OPE.FechaAAnalizar < @DATETO
GROUP BY idTipoDeRespuesta

--test combinaciones tipos con horas
/*
SELECT [hour], [type] FROM #tableHours, #tableTypes
ORDER BY [hour], [type]
*/

SELECT * FROM
(
--Tabla de datos reales
SELECT DATEPART(hh,FechaAAnalizar) 'hour', idTipoDeRespuesta 'type', count(1) 'Value' FROM TablaReporte OPE
WHERE OPE.FechaAAnalizar > @DATEFROM
and  OPE.FechaAAnalizar < @DATETO
GROUP BY DATEPART(hh,FechaAAnalizar), idTipoDeRespuesta

UNION
--Agregar combinaciones que no se encuentren en los datos reales
SELECT [hour], [type] , 0 FROM
(
SELECT [hour], [type] FROM #tableHours, #tableTypes
) AS Combinaciones
WHERE CAST([hour] AS VARCHAR(30)) +  CAST([type] AS VARCHAR(30)) NOT IN
(
SELECT CAST(DATEPART(hh,FechaAAnalizar) AS VARCHAR(30)) + CAST(idTipoDeRespuesta  AS VARCHAR(30))  FROM TablaReporte OPE
WHERE OPE.FechaAAnalizar > @DATEFROM
and  OPE.FechaAAnalizar < @DATETO
GROUP BY DATEPART(hh,FechaAAnalizar), idTipoDeRespuesta
)
) AS ResultFinal
ORDER BY 'hour', 'type'

Sean felices! :) Y siéntanse libres de opinar ;)

No hay comentarios:

Publicar un comentario

Palabras Clave

.NET (93) AJAX (2) ajaxcontroltoolkit (2) Algoritmos (1) android (1) Angular (1) Arrays (1) AS2 o ActionScript 2.0 (1) AS3 o ActionScript 3.0 (64) ASP (7) ASP.NET (3) Azure (1) Azure DevOps (2) Backup (2) Batch (4) blogger (1) Browser Support (2) C# (53) Charts (1) Chorme extensions (1) Chrome (3) cmd (18) código postal (1) Colombia tips (1) command (1) Conexion remota (1) Controles Web .NET (24) Cookies (1) cordova (1) CSS (14) CSV (5) Cufon (1) DateTime (2) deployment (2) Desarrollo movil (2) Desarrollo web (5) Diseño (4) DNN o DotNetNuke (5) docker (1) Encuestas (1) Entity Framework (1) Error (1) Eval (2) Excel (4) Expresiones regulares (2) Facebook (14) fechas (1) Fiddler (1) FileUpload (1) Filezilla (1) Firefox (2) Flash (9) Fonts (3) FQL (1) frameworks (2) Futuro de la web (1) git (1) Google Code (13) Google Maps (4) hackintosh (3) hazard 10.6.2 (3) herramientas para developers (1) highchart (1) Hilos (2) Hosting Windows (18) HTML (38) HTML5 (6) IDE (1) IE (2) IE9 (1) IIS (13) imagenes (3) jasmine (2) java (1) jqgrid (2) Jquery y Javascript (90) jquery-ui (5) jQueryMobile (1) JSON (1) knockout (4) library (1) Link Interesantes (2) List (1) Macro (2) Matemáticas (2) Membership (6) Memoria (1) Mis Experiencias (3) momentjs (1) ms-dos (1) MSN (1) MVC (1) MVC4 (3) MySQL (2) node.js (4) Notepad++ (3) Notificaciones (1) ObjectDataSource (2) Online (2) Opinión (4) OSX (3) Parallels Plesk Panel (1) petapoco (1) PhantomJS (1) PHP (4) Porqué este blog (1) Powershell (1) Razor (3) Redes (2) REGEX (4) REST (1) SDK Android (1) Seguridad (1) SelectParameters (1) Selenium (2) sencha (3) sencha cmd (2) SEO (1) SMTP (2) Software útil (8) Solución (1) Soporte (1) SQL (15) SQL Server (58) SQLite (2) Store Procedures (20) String (5) Testing Code (2) texto (2) tips de datos (1) tips de desarrollo (1) TutoFaceAS3 (4) TutoProAS3 (4) Tutoriales (7) Tweenlite effects (3) Últimas noticias (1) unit testing (1) usb (1) VBA (1) Video (1) virus (1) Web API (2) Web Browsers (1) Web Forms (7) web.config (1) Webmaster (8) Webmatrix (1) webrole (1) webservices (1) webstorm (1) Win Forms (5) Windows (21) Windows 7 (1) Windows 8 (1) XML (2) Youtube API (2)