2014-07-09 120 views
0

下面的查詢是通過約一百萬行枚舉計算MTBUR(標準時間計劃外的維修間隔):轉換失敗

DECLARE @BeginDate date = '01-01-2013', 
     @EndDate date = '12-31-2013' 
BEGIN 
    SELECT H.AutoType 
      ,COALESCE(SUM(CASE WHEN (R.ReceiveDate BETWEEN @BeginDate AND @EndDate) 
          THEN H.Hours ELSE 0 END) 
        /COUNT(CASE WHEN (R.ReceiveDate BETWEEN @BeginDate AND @EndDate) 
          AND (R.Confirm NOT LIKE 'C%' AND R.Confirm NOT LIKE 'Y%') 
          THEN R.Confirm ELSE 0 END) 
       , SUM(H.Hours)) AS 'MTBUR' 
    FROM [Hours] H 
    INNER JOIN Repair R ON H.SN = R.SN 
    GROUP BY H.AutoType 
    ORDER BY AutoType ASC 
END 

我得到以下錯誤消息:

Msg 245, Level 16, State 1, Line 4 
Conversion failed when converting the nvarchar value 'YES' to data type int. 

我推斷出從錯誤信息的YES是從第一個「CASE」語句布爾評價結果;如我錯了請糾正我。

以下是我的僞代碼:

The numerator is the sum of all hours between @BeginDate and @EndDate 
The denominator is the COUNT of all confirmed status NOT LIKE %C and NOT LIKE %Y AND between @BeginDate and @EndDate. 

我一直在擺弄這個查詢天;是的,我只是一個新手,只是學習。很想完成這件事,並移動到下一個衝刺

+0

什麼'YES'應該是類似於'INT'你覺得呢? – Rahul

+0

什麼數據類型是R.Confirm? – JodyT

+0

@JodyT R.Confirm is varchar –

回答

0

你的情況下,返回從別的一個int 0,但是從當部分文字,但是從情況下,返回類型必須是一致的。

試着改變你的情況下返回1,而不是確認。

即變化:

... THEN R.Confirm ELSE 0 END), SUM(H.Hours) ... 

要:

... THEN 1 ELSE 0 END), SUM(H.Hours) ... 

與變革算上包裝功能部件總結

+0

如果我用'1'替換'R.Confirm',那麼DBMS如何計算'R.Confirm NOT LIKE C%或Y%'的數目? –

+0

如果更改COUNT爲SUM(按我的答案),它會工作,因爲你會求和1或0,這是一樣的計數,當它是真的 – Bohemian

+0

我得到它現在...我很困惑,我想我是僅計算特定的列,但基本上我只是想計算行數(或金額)我得到它....現在我零錯誤這是我COALESCE語句應該糾正 –

0
/COUNT(CASE WHEN (R.ReceiveDate BETWEEN @BeginDate AND @EndDate) 
      AND (R.Confirm NOT LIKE 'C%' AND R.Confirm NOT LIKE 'Y%') 
      THEN R.Confirm ELSE 0 END) 

錯誤實際上出現在你的第二個case語句。 您的代碼意味着R.Confirm是一個字符串,但試圖通過它,當你的case語句是真的來劃分。

所以這行實際上需要修改:THEN R.Confirm ELSE 0 END

0

問題是,你錯誤地做這件事。您的COUNT CASE聲明應如下所示。此外,請注意,R.Confirm NOT LIKEOR條件,而AND

SUM(CASE WHEN R.ReceiveDate BETWEEN @BeginDate AND @EndDate 
AND (R.Confirm NOT LIKE 'C%' OR R.Confirm NOT LIKE 'Y%') 
THEN 1 ELSE 0 END) 
+0

如果我用'1'替換了'R.Confirm',那麼DBMS如何計算'R.Confirm不喜歡C%還是Y%'? –

+0

@JeffOrris,你都搞不清楚,你'count'你正在使用'CASE'檢查,而不是計算所有行的條件和;只計算與CASE條件匹配的行。 – Rahul

+0

我想計算'R中的行數。證實符合條件的列' –