我要求获取未来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#
中实现此目的的最佳选择是什么答案 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
结果是:
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月 - > 12月)。
联盟默认月份表与您的输出表和 SUM (您可以显示的那些列)这些列:
(MachineDownTimes
,MaterialsDownTimes
,LineBalancingLost
,Others)