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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top