2015-05-04 42 views
0

我試圖計算運行總數,它的工作原理是正確的,但只有當我調節的值可用。當一些不可用,計算腳麻,一些NULL的發生,並在年底運行總計不正確,這裏有這樣的情況,例如:運行Total作爲SUM()OVER()SQL中缺少值時

this is when there was no values for some month_number

,我想這樣設置的屏幕截圖下面(加上缺少個月),這應該給正確運行總計(命名爲這裏積壓)結尾:

expected result

有什麼辦法來定義full_year和MONTH_NUMBER列與「0」值可見什麼時候沒有價值?

我當前的查詢如下:

IF OBJECT_ID('tempdb..#Temp4') IS NOT NULL BEGIN 
     drop table #Temp4 
end 

SELECT * into #Temp4 
    from (
SELECT 
datepart(yy, t3.[datestamp]) AS full_year 
,datepart(mm, t3.[datestamp]) AS month_number 
,count(*) as number_of_activities 
,t2.affected_item 
FROM [sm70prod].[dbo].[ACTSVCMGTM1] AS t3 
JOIN [sm70prod].[dbo].[INCIDENTSM1] AS t2 ON t3.number = t2.incident_id 
WHERE 
t2.affected_item like 'service' 
AND (t3.[type] LIKE 'Open') 
GROUP BY t2.affected_item, datepart(yy, t3.[datestamp]), datepart(mm, t3.[datestamp]) 
) 
as databases (full_year, month_number, number_of_activities, affected_item) 

; 
IF OBJECT_ID('tempdb..#Temp5') IS NOT NULL BEGIN 
     drop table #Temp5 
end 

SELECT * into #Temp5 
    from (
SELECT 
datepart(yy, t3.[datestamp]) AS full_year 
,datepart(mm, t3.[datestamp]) AS month_number 
,count(*) as number_of_activities 
,t2.affected_item 
FROM [sm70prod].[dbo].[ACTSVCMGTM1] AS t3 
JOIN [sm70prod].[dbo].[INCIDENTSM1] AS t2 ON t3.number = t2.incident_id 
WHERE 
t2.affected_item like 'service' 
AND (t3.[type] LIKE 'Closed') 
GROUP BY t2.affected_item, datepart(yy, t3.[datestamp]), datepart(mm, t3.[datestamp]) 
) 
as databases (full_year, month_number, number_of_activities, affected_item) 

select * from (select o.full_year 
,o.month_number 
,o.number_of_activities as [open] 
,c.number_of_activities as [close] 
,sum(o.number_of_activities - c.number_of_activities) over (ORDER BY c.full_year, c.month_number) as [backlog] 
from #Temp4 o full join #Temp5 c on o.full_year = c.full_year and o.month_number = c.month_number) as sub 
order by full_year, month_number 

回答

0

https://msdn.microsoft.com/en-gb/library/ms190349%28v=sql.110%29.aspx
嘗試使用聚結功能:

COALESCE(someattribute, 0); 

如果屬性將被用來代替NULL值爲零。

還要注意:

當比較VARCHAR處理沒有一個正則表達式
你應該使用  =  運營商,而不是LIKE操作。

+0

我可以使用COALESCE作'開放'或'關閉'列,但首先我需要一些如何添加缺少月份的行,我不能使用COALESCE。通過找到一種如何呈現缺失月份的方法,「open」和「close」列中不應該有NULL。 – Janek

0

我找到了答案。對於丟失的幾個月裏,我可以使用如下代碼:

If(OBJECT_ID('tempdb..#Temp6') Is Not Null) 
Begin 
    Drop Table #Temp6 
End 

create table #Temp6 

(
full_year int 
,month_number int 
) 
; WITH cteStartDate AS 
(SELECT StartDate = '2007-01-01'), 
cteSequence(SeqNo) 
    AS (SELECT 0 
     UNION ALL 
     SELECT SeqNo + 1 
     FROM cteSequence 
     WHERE SeqNo < DATEDIFF(MM,(SELECT StartDate FROM cteStartDate),getdate())) 

INSERT INTO #Temp6 
SELECT datepart(yy, DATEADD(MM,SeqNo,(SELECT StartDate FROM cteStartDate))) AS full_year 
,datepart(mm, DATEADD(MM,SeqNo,(SELECT StartDate FROM cteStartDate))) AS month_number 
FROM cteSequence 
OPTION (MAXRECURSION 0) 

那麼我可以用full join#Temp4,加ISNULL(o.number_of_activities, 0),同爲#Temp5,它會工作。