sql пропускает строки при группировке по ДНЯМ, МЕСЯЦАМ, ГОДАМ

StackOverflow https://stackoverflow.com/questions/40456

  •  09-06-2019
  •  | 
  •  

Вопрос

Если я выберу из таблицы группу по месяцу, дню, году, он возвращает только строки с записями и не учитывает комбинации без каких-либо записей, из-за чего с первого взгляда кажется, что каждый день или месяц имеет активность, вы должны активно просматривать столбец даты на предмет пробелов.Как я могу получить строку для каждого дня / месяца / года, даже если данных нет, в T-SQL?

Это было полезно?

Решение 2

Мой разработчик вернулся ко мне с этим кодом, подчеркивает, преобразуется в тире, потому что StackOverflow искажает подчеркивания - без цифр стол обязателен. Наш пример немного усложняется соединением с другой таблицей, но, возможно, пример кода кому-нибудь когда-нибудь поможет.

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 

Другие советы

Создать таблицу календаря и внешнее объединение для этой таблицы

Узнайте, как использовать номера. таблица . Несмотря на то, что это может быть хакерским, это лучший метод, который я нашел, чтобы быстро запрашивать отсутствующие данные или показывать все даты или что-либо еще, где вы хотите проверить значения в пределах диапазона, независимо от того, используются ли все значения в этом диапазоне.

Опираясь на сказанное в SQLMenace, вы можете использовать CROSS JOIN для быстрого заполнения таблицы или эффективного ее создания в памяти.
http://www.sitepoint.com/forums/showthread.php?t= 562806

Задача требует, чтобы полный набор дат был присоединен к вашим данным слева, например


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]

где табличная функция tvfUtilGenerateIntegerList определяется как


-- 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top