SQL fehlt Zeilen bei Gruppierung nach TAG, MONAT, JAHR
Frage
Wenn ich aus einer Tabellengruppe nach Monat, Tag, Jahr, Es werden nur Zeilen mit Datensätzen zurückgegeben und Kombinationen ohne Datensätze ausgelassen, so dass es auf einen Blick so aussieht, als ob jeder Tag oder Monat Aktivität hat, Sie müssen aktiv in der Datumsspalte nach Lücken suchen.Wie kann ich in T-SQL eine Zeile für jeden Tag/Monat/Jahr erhalten, auch wenn keine Daten vorhanden sind?
Lösung 2
Mein Entwickler habe mich mit diesem Code kontaktiert, Unterstriche wurden in Bindestriche umgewandelt, weil StackOverflow Unterstriche verstümmelte – keine Zahlentabelle erforderlich.Unser Beispiel wird durch einen Join mit einer anderen Tabelle etwas komplizierter, aber vielleicht hilft das Codebeispiel irgendwann jemandem.
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
Andere Tipps
Erstellen Sie eine Kalendertabelle und einen Outer-Join für diese Tabelle
Erwägen Sie die Verwendung von a Zahlentabelle.Obwohl es hackig sein kann, ist es die beste Methode, die ich kenne, um schnell fehlende Daten abzufragen oder alle Daten oder alles anzuzeigen, wo Sie Werte innerhalb eines Bereichs untersuchen möchten, unabhängig davon, ob alle Werte in diesem Bereich verwendet werden.
Aufbauend auf dem, was SQLMenace gesagt hat, können Sie einen CROSS JOIN verwenden, um die Tabelle schnell zu füllen oder sie effizient im Speicher zu erstellen.
http://www.sitepoint.com/forums/showthread.php?t=562806
Die Aufgabe erfordert, dass ein vollständiger Satz von Datumsangaben mit Ihren Daten verknüpft wird, z. B
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]
wobei die Tabellenwertfunktion tvfUtilGenerateIntegerList definiert ist als
-- 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