【问题标题】:Take Monthly data From table based on StartDate and endDate根据 StartDate 和 endDate 从表中获取月度数据
【发布时间】:2016-07-06 12:57:22
【问题描述】:

我有一个包含详细信息(状态、ID、标题等)以及开始日期和结束日期的主表。需要当前年度的每月有效详细信息。

我做了这样的事情,它给了我每月的记录,但没有考虑年份。当表行增加时,这段代码太慢了。请帮帮我。

DECLARE @LoopCounter INT,
        @Max INT, 
        @MonthName NVARCHAR(100),
        @TransStatus int,
        @Year int
BEGIN
    SELECT @LoopCounter = min(id), @Max = max(Id) 
    FROM TableName

    CREATE TABLE #Active 
    (
        Id INT IDENTITY(1,1),
        Month varchar(30)
    )

    WHILE (@LoopCounter <= @Max)
    BEGIN
        INSERT into #Active
            SELECT DateName(MONTH, DATEADD(MONTH, nos.monthnos, (Select StartDate from TableName where id=@LoopCounter And Year(StartDate)=@Year)-1 ) )
            FROM (SELECT 1 monthnos
                    UNION SELECT 2
                    UNION SELECT 3
                    UNION SELECT 4
                    UNION SELECT 5
                    UNION SELECT 6
                    UNION SELECT 7
                    UNION SELECT 8
                    UNION SELECT 9
                    UNION SELECT 10
                    UNION SELECT 11
                    UNION SELECT 12) nos 
            WHERE nos.monthnos <= DATEDIFF(MONTH, (Select StartDate from TableName where id=@LoopCounter),
                                                  (Select EndDate from TableName where id=@LoopCounter)+1 )
        SET @LoopCounter = @LoopCounter + 1
    END
END

SELECT COUNT(*) As ActiveCount, Month 
FROM #Active 
GROUP BY Month

【问题讨论】:

  • 您正在使用循环插入数据。难怪它太慢了。也许如果您能解释该代码在做什么,我们可以帮助您找到基于集合的方法。代码的格式对我来说实在是太麻烦了,无法尝试破译。
  • 如果您只使用上述查询生成月份,您希望您的查询如何考虑几年?我建议您在问题中添加一些示例数据和预期输出。一旦人们对您的问题有了一点直观了解,也许它会更有意义,记住一件事,当您要在 sql server 中编写 while 循环时,退后一步想想,几乎总是有更好的方法这样做。

标签: sql-server


【解决方案1】:

您的问题有点令人困惑,但基于“需要本年度每月有效的详细信息”,我认为这样的事情对您来说会快得多。

    SELECT COUNT(*), YEAR([Start Date]), Month([Start Date])
    FROM MasterTable
    WHERE [Start Date] BETWEEN DATEADD(yy, DATEDIFF(yy,0,getdate()), 0) AND GETDATE()
    GROUP BY 
    YEAR([Start Date]), Month([Start Date])

【讨论】:

  • 或者干脆... WHERE YEAR([StartDate]) = @Year ...
  • 好电话@Sphinxxx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
  • 1970-01-01
相关资源
最近更新 更多