在SQL Server中滚动12个月的数据

时间:2016-03-31 03:11:33

标签: c# sql sql-server

我要求获取未来12个月的滚动数据。如果数据库中不存在数据,则会附带一个特殊条件来显示带有空白数据的月份。例如 - 如果数据仅存在于2017年1月,那么结果查询也应显示2017年2月,但显示空白数据。

使用以下查询,我可以获取存在的数据。我不想添加任何循环来检查缺少哪个月并添加这些月份。

SELECT
        SiteCode
        ,CustomerName
        ,CalYear
        ,CalMonth
        ,CalDay
        , CONVERT(DATE,CONVERT(VARCHAR(4),CalYear)+'-'+CONVERT(VARCHAR(2),CalMonth)+'-'+CONVERT(VARCHAR(2),CalDay)) AS CalDate
        ,MachineDownTimes
        ,MaterialsDownTimes
        ,LineBalancingLost
        ,Others
FROM 
        dbo.ProcessBackend
WHERE CustomerName = 'ZAS' AND SiteCode = 'HU01'
        AND DATEFROMPARTS(CALYEAR, CALMONTH, CALDAY) 
        BETWEEN DATEFROMPARTS(DATEPART(YEAR, GETDATE()), DATEPART(MONTH, GETDATE()), 1) AND 
        DATEFROMPARTS(DATEPART(YEAR, (DATEADD(MONTH, 12, GETDATE()))), DATEPART(MONTH, (DATEADD(MONTH, 12, GETDATE()))), 1)

在SQL或C#

中实现此目的的最佳选择是什么

2 个答案:

答案 0 :(得分:1)

如前所述,这些是实现目标的步骤:

1)创建月份表,因为即使数据不存在也要显示月份数据。你可以从these answers中选择一些东西 - 我已经从那里调整了最简洁的解决方案:

declare @today DATE = GETDATE()
declare @thisMonth DATE = DATEFROMPARTS(YEAR(@today), MONTH(@today), 1)
declare @startMonth DATE = DATEADD(month, -11, @thisMonth)

PRINT 'This month '; PRINT @thisMonth
PRINT 'Start month '; PRINT @startMonth

declare @monthInfo TABLE (BOM DATE)

insert into @monthInfo (BOM)
select top 11 dateadd(month, num, @startMonth) as mon
from (select row_number() over (order by (select 1)) as num
      from sys.columns c
     ) n cross join
     (select @startMonth firstdate) const

SELECT * FROM @monthInfo

结果是:

BOM

2015-05-01  
2015-06-01  
2015-07-01  
2015-08-01  
2015-09-01  
2015-10-01  
2015-11-01  
2015-12-01  
2016-01-01  
2016-02-01  
2016-03-01  

2)通过从生成的日期和表格

中进行选择来创建最终查询
DECLARE @CustomerName VARCHAR(100) = 'ZAS'
DECLARE @SiteCode VARCHAR(32) = 'HU01'

;WITH CTE AS (
    SELECT SiteCode, CustomerName, DATEFROMPARTS(CalYear, CalMonth, 1) AS CalMonth, 
        MachineDownTimes, MaterialsDownTimes, LineBalancingLost, Others
    FROM dbo.ProcessBackend
    WHERE CustomerName = @CustomerName  AND @SiteCode = @SiteCode 
)
SELECT @CustomerName, @SiteCode, M.BOM, 
    SUM(MachineDownTimes), SUM(MaterialsDownTimes), SUM(LineBalancingLost), SUM(Others)
FROM @monthInfo M 
    LEFT JOIN CTE ON CTE.CalMonth = M.BOM 
GROUP BY CTE.CustomerName, CTE.SiteCode, M.BOM

答案 1 :(得分:0)

  1. 创建默认月份表,其中包括(1月 - > 12月)。

  2. 联盟默认月份表与您的输出表和 SUM (您可以显示的那些列)这些列:

        (MachineDownTimes
        ,MaterialsDownTimes
        ,LineBalancingLost
        ,Others)
    
  3. 完成。
  4. 参考:Fill empty dates in a matrix SSRS