filas ejemplos datos consultas complejas afectadas tsql date grouping

tsql - consultas - ejemplos de sql en base de datos



sql faltan filas cuando se agrupan por DÍA, MES, AÑO (5)

Si selecciono de un grupo de tablas por mes, día, año, solo devuelve filas con registros y omite combinaciones sin ningún registro, lo que hace que parezca de un vistazo que cada día o mes tiene actividad, debe mirar la fecha columna activamente para las lagunas. ¿Cómo puedo obtener una fila para cada día / mes / año, incluso cuando no hay datos, en T-SQL?


Considera usar una tabla de números . Si bien puede ser hackish, es el mejor método que he utilizado para consultar rápidamente los datos que faltan, o mostrar todas las fechas, o cualquier cosa en la que desee examinar valores dentro de un rango, independientemente de si se usan todos los valores en ese rango.


Cree una tabla de calendario y una combinación externa en esa tabla



La tarea requiere un conjunto completo de fechas para unirlas a sus datos, como


DECLARE @StartInt int
DECLARE @Increment int
DECLARE @Iterations int

SET @StartInt = 0
SET @Increment = 1
SET @Iterations = 365


SELECT
tCompleteDateSet.[Date]
,AggregatedMeasure = SUM(ISNULL(t.Data, 0))
FROM
(

SELECT
[Date] = dateadd(dd,GeneratedInt, @StartDate)
FROM
[dbo].[tvfUtilGenerateIntegerList] (
@StartInt,
,@Increment,
,@Iterations
)
) tCompleteDateSet
LEFT JOIN tblData t
ON (t.[Date] = tCompleteDateSet.[Date])
GROUP BY
tCompleteDateSet.[Date]

donde la función de valor de tabla tvfUtilGenerateIntegerList se define como


-- Example Inputs

-- DECLARE @StartInt int
-- DECLARE @Increment int
-- DECLARE @Iterations int
-- SET @StartInt = 56200
-- SET @Increment = 1
-- SET @Iterations = 400
-- DECLARE @tblResults TABLE
-- (
-- IterationId int identity(1,1),
-- GeneratedInt int
-- )


-- =============================================
-- Author: 6eorge Jetson
-- Create date: 11/22/3333
-- Description: Generates and returns the desired list of integers as a table
-- =============================================
CREATE FUNCTION [dbo].[tvfUtilGenerateIntegerList]
(
@StartInt int,
@Increment int,
@Iterations int
)
RETURNS
@tblResults TABLE
(
IterationId int identity(1,1),
GeneratedInt int
)
AS
BEGIN

DECLARE @counter int
SET @counter= 0
WHILE (@counter < @Iterations)
BEGIN
INSERT @tblResults(GeneratedInt) VALUES(@StartInt + @counter*@Increment)
SET @counter = @counter + 1
END


RETURN
END
--Debug
--SELECT * FROM @tblResults


Mi desarrollador me respondió con este código, los guiones bajos se convirtieron en guiones porque estaba subrayando los guiones bajos, no se requiere tabla de números. Nuestro ejemplo se complica un poco si te unes a otra tabla, pero tal vez el ejemplo de código ayude a alguien algún día.

declare @career-fair-id int select @career-fair-id = 125 create table #data ([date] datetime null, [cumulative] int null) declare @event-date datetime, @current-process-date datetime, @day-count int select @event-date = (select careerfairdate from tbl-career-fair where careerfairid = @career-fair-id) select @current-process-date = dateadd(day, -90, @event-date) while @event-date <> @current-process-date begin select @current-process-date = dateadd(day, 1, @current-process-date) select @day-count = (select count(*) from tbl-career-fair-junction where attendanceregister <= @current-process-date and careerfairid = @career-fair-id) if @current-process-date <= getdate() insert into #data ([date], [cumulative]) values(@current-process-date, @day-count) end select * from #data drop table #data