2017-05-09 15 views
0

我對這個問題的背景有很多解釋,所以請耐心等待。如何填寫缺失日期爲行並給出其他值? (例外情況)

在我的公司,我們有一個SQL Server數據庫,我正在管理工作室2014. 我們有一個名爲JobStatistics的表,它顯示在每個小時的間隔期間完成多少個作業。 The table looks like this

該站的領域基本上是不同的領域可以做的工作。

正如您所看到的,某些行缺少某些時間間隔,這是因爲該表充滿了數據。爲了填充這個表格,我們有一個運行的腳本查看另一個表格並聚合此間隔之間所有日期的作業數量。換句話說,如果沒有任何作業,將不會插入一行,因爲不會插入任何內容(從另一個表中沒有行來聚合任何作業)。

我想在這裏做的是填補這些額外的間隔0作爲工作量。因此,每天和每個車站總是會有24個時間間隔(小時)。最重要的是,我們已經設定了我們想實現的目標,並且我在另一個名爲JobstatisticsTargets的表中聲明瞭這些目標,您可以調用日曆表來加入Jobstatistics表。

The calender table looks like this

我已經嘗試做了向左或向右聯接,以便丟失的時間間隔將得到填充和喬布斯就至少得拿到NULL值,但加盟條款沒有做什麼,我希望它。

這是我試過的嘗試

SELECT a.[Station], a.[Interval], a.[Jobs], b.[28JPH], b.[35JPH] 
FROM [JobStatistics] a 
RIGHT JOIN [JobStatisticsTargets] b 
    ON CONVERT(VARCHAR(10),a.Interval,108) = b.Interval 
WHERE DATEDIFF(DAY, a.Interval, GETDATE()) < 12 
    AND Station LIKE '138010' 
ORDER BY a.Station, a.Interval 

的LEFT JOIN究竟一樣我希望正常的加入做,它不與NULL值附加任何間隔。 (查詢只是一個站和幾天,所以我可以輕鬆測試)

任何幫助,非常感謝。我會定期檢查這個主題,所以如果你有任何問題,一定要問任何關於上下文的問題,我會盡力解釋它!

編輯 一些幫助查詢現在看起來是這樣

SELECT a.[Station], b.[Interval], a.[Jobs], b.[28JPH], b.[35JPH] 
FROM [JobStatistics] a 
RIGHT JOIN [JobStatisticsTargets] b 
    ON CONVERT(VARCHAR(10),a.Interval,108) = b.Interval 
    AND CONVERT(VARCHAR(10),a.Interval,110) = CONVERT(VARCHAR(10),GETDATE(),110) 
    AND Station LIKE '138010' 
ORDER BY b.Interval 

,否則額外的行沒有什麼,我希望他們能在所有我今天的日期現在篩選。問題是我不知道填充我的電臺的簡單方法。我想我需要一個子查詢,還是有另一種方式?

現在的問題是,我不能爲不同的電臺做這個查詢。我希望爲代表的所有間隔每站24列,但我得到這個結果:

Station Interval Jobs 28JPH 35JPH 
NULL  00:30:00 NULL 0  0 
NULL  01:30:00 NULL 0  0 
NULL  02:30:00 NULL 0  0 
NULL  03:30:00 NULL 0  0 
134040 04:30:00 2  0  0 
136060 04:30:00 2  0  0 
131080 04:30:00 2  0  0 
138010 05:30:00 2  0  0 
NULL  06:30:00 NULL 0  0 
NULL  07:30:00 NULL 28  35 
NULL  08:30:00 NULL 28  35 
... 
+0

您需要使用正確的連接,因爲缺少的值在左邊的表上。 – artm

+0

我試過了,這不會改變任何輸出。這就是爲什麼我有點困惑。這次加入並沒有達到我期望的水平。 – user7984494

回答

0

您在字段進行篩選,從該行可能無法在連接結果提交表>>>和車站LIKE「138010」 您應該更改您的查詢,並把這個條件在ON子句,而不是在WHERE

+0

我確實得到了一個輸出,但就好像它是一個正常的JOIN子句(只有左表中具有相應目標的行)。 我試着把條件放在on子句上,輸出仍然保持不變。 – user7984494

+0

還有其他條件,DATEDIFF(DAY,a.Interval,GETDATE())<12,它將你的外連接變成inner.This也必須遷移到ON條款 – sepupic

+0

我看,非常感謝答案。我認爲這無疑是朝着正確方向邁出的一步。 但是,我怎樣才能填寫這樣的NULL值? 我應該至少能夠填寫間隔值,否則我將不得不每天都進行這種查詢,並使用右表中的間隔進行填充。 – user7984494

0

檢查這個劇本,讓我知道,

declare @t table(interval datetime,jobs int) 
insert into @t VALUES('2017-04-28 05:30',1),('2017-04-28 06:30',5),('2017-04-29 06:30',5) 
--select * from @t 
;With CTE as 
(
    select cast('00:00' as time) as IntervalTime 
    union ALL 
    select DATEADD(MINUTE,30,IntervalTime) 
    from cte 
    where IntervalTime<'23:30' 
) 
,CTE1 AS(
select interval,jobs 
,dense_rank()over(order by cast(interval as date))rn 
from @t 
) 
select * FROM 
(
select distinct case when t.interval is null then 
DATEADD(day, DATEDIFF(day, 0, 
(select top 1 interval from cte1 where rn=n.number)), cast(c.IntervalTime as datetime)) 
else t.interval end Newinterval,isnull(t.jobs,0) Jobs 

from CTE c 
left join cte1 t 
on c.IntervalTime=cast(t.interval as time) 
cross apply(select number from master.dbo.spt_values 
    where name is null and number<=(select max(rn) from cte1))n 
)t4 
where Newinterval is not null