2014-05-20 76 views
2

我知道標題聽起來很簡單。但是,這實際上是我可以考慮在當時措辭的唯一方式。讓我來解釋進一步SQL:如何計算表中所有數據的某些日期範圍

我得到Repairs修復數據上SN

我需要爲是在一年之內從每一個季度開始,該表的每一行做計算,我INNER JOINHours表。以下是我組織的季度開始日期:

Q1開始日期= 1月1日; Q2開始日期= 4月1日; Q3開始日期= 7月1日; Q4開始日期= 10月1日

所以,我需要數從RepairsFailures#OfHoursHours - 從1月1日至12月31日; 4月1日至次年3月31日等....我需要sum所有的失敗到幾小時來計算平均無故障時間。

有人可以幫我開始這個查詢;它開始挫敗我,我是一名實習生,並希望在不問我的經理的情況下完成此任務。謝謝

我知道我想要做的事情,但我在腦海中的語法混亂。

編輯:

以下是我的查詢來獲取我想要的原始數據:

SELECT * 
FROM Hours H 
INNER JOIN Repair R 
ON H.SN = R.SN 
WHERE R.Confirmed NOT LIKE 'OC%' OR R.Confirmed NOT LIKE 'YC%' 

因爲有超過70,000行,我會限制結果做到20 Calcs(計算);抽樣結果如下(我只包括相關列:

------------------------------------------------------------------- 
SN |Type |Hours |ReportDate |Part |DateReceived | 
------------------------------------------------------------------- 
1111 |Ford |170  |2012-05-01 |9000000 |2012-10-19 
2222 |Ford |170  |2012-05-01 |9000001 |2012-10-12 
3333 |Ford |170  |2012-05-01 |9000002 |2012-10-19 
4444 |Chevy |180  |2013-04-01 |9000001 |2014-04-04 
5555 |Chevy |180  |2013-04-01 |9000002 |2014-03-30 
6666 |Chevy |180  |2013-04-01 |9000003 |2014-04-04 
7777 |Dodge |180  |2012-03-01 |9000001 |2012-03-30 
8888 |Dodge |174  |2012-03-01 |9000001 |2012-04-04 
9999 |Dodge |174  |2012-03-01 |9000001 |2012-03-30 
1212 |Chevy |210  |2012-03-01 |9000002 |2012-04-04 
2323 |Lincoln |140  |2010-04-01 |9000001 |2012-05-30 
3434 |Lincoln |140  |2010-04-01 |9000002 |2012-04-04 
4545 |Lincoln |140  |2010-04-01 |9000000 |2012-03-30 
5656 |Dodge |10  |2010-02-01 |9000004 |2012-04-04 
6767 |Chevy |190  |2011-02-01 |9000005 |2012-03-30 
7878 |Lincoln |160  |2011-02-01 |9000000 |2012-04-04 
8989 |Dodge |140  |2011-06-01 |9000001 |2012-03-30 
0101 |Chevy |169  |2011-07-01 |9000001 |2012-04-04 

我要做的MTBF計算GROUPED BYTYPEGROUPED BYPART我需要檢索季度之間的一年間所有的報告日期爲曾表示林。 。在我的腦海混雜這一點,並不能把握查詢做到這一點

任何幫助將是巨大的感謝

編輯:關於什麼是我想要做的

更好的理解

以下是我想要做的一個很好的例子,但它需要每一個季度做(這個查詢不會放棄什麼,我想雖然):

DECLARE @BeginDate date = '1013-01-01' 
BEGIN 
SELECT * 
FROM Hours H 
INNER JOIN Repair R 
ON H.SN = R.SN 
WHERE (R.Confirmed NOT LIKE 'OC%' OR R.Confirmed NOT LIKE 'YC%') AND (DATEDIFF([DAY], @BeginDate, DateReceived) <= 365) AND (DATEDIFF([DAY], @BeginDate, ReportDate) <= 365) 
END 

我想上面的查詢來獲取我所有的記錄,其中ReportDateDateReceived都在一年內。這會產生每季度I.E的年度報告。 1月1日 - 12月31日,4月1日 - 3月31日,7月1日 - 9月31日和10月1日 - 12月31日。

同樣,這不會產生我想要的結果,但可能會更好地理解我'米試圖做。再次,這將在每個季度完成。

編輯:下面是一些示例輸出應該看起來像給出上述查詢。我將Type列更改爲單個字母以提高效率;它不是有關:

enter image description here

+0

您能舉一個具體的數據例子嗎?像一些行與相關的列?或者至少是列名?這將有助於你。 –

+1

是的......這將是一個分鐘雖然...我必須「虛擬」它(敏感) –

+0

@magic_al我提供了一些示例數據,我也忘記了從'Repairs'添加一個'Date Received'列這是失敗的日期......「ReportDate」列是我獲得的關於運行多少小時的月度報告日期。 –

回答

1

我敢肯定這是不是你想要的一切(你提到MTBF),但應該足以讓你足夠接近。根據您顯示的數據,以下是每個部分的報告,其失敗次數以及每個上市季度之前每年的維修小時數。請注意,如果您堅持要求ReportDate DateReceived處於相同的結尾年份,將導致誤導性結果,因爲它不包含例如具有ReportDate 1/4/2010和ReceivedDate 3/30/2012的SN 4545。這是140小時,不會顯示在報告中的任何地方。那真的是你想要的嗎?

WITH 
Quarters AS 
(SELECT DATE '2011-01-01' as Quarter FROM dual UNION ALL 
    SELECT DATE '2011-04-01' FROM dual UNION ALL 
    SELECT DATE '2011-07-01' FROM dual UNION ALL 
    SELECT DATE '2011-10-01' FROM dual UNION ALL 
    SELECT DATE '2012-01-01' FROM dual UNION ALL 
    SELECT DATE '2012-04-01' FROM dual UNION ALL 
    SELECT DATE '2012-07-01' FROM dual UNION ALL 
    SELECT DATE '2012-10-01' FROM dual UNION ALL 
    SELECT DATE '2013-01-01' FROM dual UNION ALL 
    SELECT DATE '2013-04-01' FROM dual UNION ALL 
    SELECT DATE '2013-07-01' FROM dual UNION ALL 
    SELECT DATE '2013-10-01' FROM dual 
), 
ByQuarter AS 
(SELECT h.*, R.PART, R.DATERXD, Q.Quarter 
    FROM Hours H 
    JOIN REPAIR R 
    ON H.SN = R.SN 
    JOIN Quarters q 
    ON q.Quarter - r.DateRxd BETWEEN 1 AND 365 
     AND q.Quarter - h.RptDate BETWEEN 1 AND 365 
) 
-- select * from ByQuarter ORDER BY Quarter, RptDate, sn; -- Examine "raw" data 
    SELECT bq.Part, bq.Quarter, Count(1) as Failures, Sum(bq.Hours) AS TotalHours 
    FROM ByQuarter bq 
    GROUP BY Part, Quarter 
    order by Part, Quarter; 
+0

謝謝回覆!這很有幫助 –

相關問題