sql пропущенных строк при группировке по Дню, Месяцу, Году - PullRequest
3 голосов
/ 03 сентября 2008

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

Ответы [ 5 ]

4 голосов
/ 03 сентября 2008

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

1 голос
/ 03 сентября 2008

Мой разработчик вернулся ко мне с этим кодом, подчеркивания преобразованы в тире, потому что 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 
0 голосов
/ 08 ноября 2008

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

<br/>DECLARE @StartInt int <br/>DECLARE @Increment int <br/>DECLARE @Iterations int <br/> <br/>SET @StartInt = 0 <br/>SET @Increment = 1 <br/>SET @Iterations = 365 <br/> <br/> <br/>SELECT <br/> tCompleteDateSet.[Date] <br/> ,AggregatedMeasure = SUM(ISNULL(t.Data, 0)) <br/>FROM <br/> (<br> <br/> SELECT <br/> [Date] = dateadd(dd,GeneratedInt, @StartDate) <br/> FROM <br/> [dbo].[tvfUtilGenerateIntegerList] ( <br/> @StartInt, <br/> ,@Increment, <br/> ,@Iterations <br/> ) <br/> ) tCompleteDateSet <br/> LEFT JOIN tblData t <br/> ON (t.[Date] = tCompleteDateSet.[Date]) <br/>GROUP BY <br/> tCompleteDateSet.[Date]

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

<br/>-- Example Inputs <br/> <br/>-- DECLARE @StartInt int <br/>-- DECLARE @Increment int <br/>-- DECLARE @Iterations int <br/>-- SET @StartInt = 56200 <br/>-- SET @Increment = 1 <br/>-- SET @Iterations = 400 <br/>-- DECLARE @tblResults TABLE <br/>-- ( <br/>-- IterationId int identity(1,1), <br/>-- GeneratedInt int <br/>-- ) <br/> <br/> <br/>-- ============================================= <br/>-- Author: 6eorge Jetson <br/>-- Create date: 11/22/3333 <br/>-- Description: Generates and returns the desired list of integers as a table <br/>-- ============================================= <br/>CREATE FUNCTION [dbo].[tvfUtilGenerateIntegerList] <br/>( <br/> @StartInt int, <br/> @Increment int, <br/> @Iterations int <br/>) <br/>RETURNS <br/>@tblResults TABLE <br/>( <br/> IterationId int identity(1,1), <br/> GeneratedInt int <br/>) <br/>AS <br/>BEGIN <br/> <br/> DECLARE @counter int <br/> SET @counter= 0 <br/> WHILE (@counter < @Iterations) <br/> BEGIN <br/> INSERT @tblResults(GeneratedInt) VALUES(@StartInt + @counter*@Increment) <br/> SET @counter = @counter + 1 <br/> END <br/><br> <br/> RETURN <br/>END <br/>--Debug <br/>--SELECT * FROM @tblResults</p> <p>

0 голосов
/ 03 сентября 2008

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

0 голосов
/ 03 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...