صفوف مفقودة في SQL عند تجميعها حسب اليوم والشهر والسنة
سؤال
إذا اخترت من مجموعة طاولة بحلول الشهر ، اليوم ، العام ، فإنه يعيد فقط الصفوف مع السجلات ويترك مجموعات دون أي سجلات ، مما يجعلها تظهر في لمحة عن وجود نشاط كل يوم أو شهر ، عليك أن تنظر إلى التاريخ العمود بنشاط للثغرات.كيف يمكنني الحصول على صف لكل يوم/شهر/سنة، حتى في حالة عدم وجود بيانات، في 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