月、日、年ごとにテーブル グループから選択すると、レコードのある行のみが返され、レコードのない組み合わせが除外されるため、毎日または毎月アクティビティがあることが一目でわかります。日付を確認する必要があります。ギャップを積極的にコラムします。T-SQLで、データが存在しない場合でも、毎日/月/年の行を取得するにはどうすればよいですか?
5 に答える
カレンダー テーブルを作成し、そのテーブルに外部結合する
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
このタスクでは、次のように、日付の完全なセットをデータに左結合する必要があります。
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
数値表の使用を検討してください。ハックかもしれませんが、不足しているデータをすばやくクエリしたり、すべての日付を表示したり、範囲内のすべての値が使用されているかどうかに関係なく、範囲内の値を調べたいものを表示したりするのに最適な方法です。
SQLMenace の発言に基づいて構築すると、CROSS JOIN を使用して、テーブルにすばやくデータを入力したり、メモリ内に効率的に作成したりできます。
http://www.sitepoint.com/forums/showthread.php?t=562806