صفوف مفقودة في 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