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
Sobre la base de lo que dijo SQLMenace, puede usar CROSS JOIN para completar rápidamente la tabla o crearla de manera eficiente en la memoria.
http://www.sitepoint.com/forums/showthread.php?t=562806
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