2013-03-29 101 views
1

我想算在我的表中的記錄,使我創造回報1.下面的函數數字是多少我有:計數的SQL函數返回值

CREATE FUNCTION isErrorMismatch 
(@theType nvarchar(1), @theExCode nvarchar(2)) 
RETURNS bit 
AS 
BEGIN 
    DECLARE @theTypeAsInt int 
    SET @theTypeAsInt = CAST(@theExCode AS INT) 

    DECLARE @returnValue bit 
    SET @returnValue = 0 

    IF @theType = 'A' 
     IF @theTypeAsInt >= 10 AND @theTypeAsInt <= 17 
      SET @returnValue = 0 
     ELSE 
      SET @returnValue = 1 
    ELSE IF @theType = 'B' 
     IF @theTypeAsInt >= 18 AND @theTypeAsInt <= 26 
      SET @returnValue = 0 
     ELSE 
      SET @returnValue = 1 
    ELSE IF @theType = 'C' 
     IF @theTypeAsInt >= 30 AND @theTypeAsInt <= 38 
      SET @returnValue = 0 
     ELSE 
      SET @returnValue = 1 
    ELSE 
      SET @returnValue = 1 

    RETURN @returnValue 
END 

GO 

SELECT (SELECT COUNT(*) 
FROM isErrorMismatch(LEFT(Type, 1),LEFT([Exception Code/Category],2)) 
As MismatchCount 
FROM dbo.[All Service Ticket Data 2012_final] 

的每個記錄,使函數返回1,我想要數。當我調用函數時,我的FROM中出現語法錯誤。有人有主意嗎?謝謝!

***更新:

爲了獲得使函數返回1計:

SELECT COUNT(dbo.isErrorMismatch(LEFT(Type, 1), LEFT([Exception Code/Category],2))) As MismatchCount 
FROM dbo.[All Service Ticket Data 2012_final] 
WHERE dbo.isErrorMismatch(LEFT(Type, 1), LEFT([Exception Code/Category],2)) = 1 

爲了得到這一切使函數返回1的記錄:

SELECT Type, [Exception Code/Category], 
dbo.isErrorMismatch(LEFT(Type, 1),LEFT([Exception Code/Category] ,2)) as Mismatch 
FROM dbo.[All Service Ticket Data 2012_final] 
WHERE dbo.isErrorMismatch(LEFT(Type, 1),LEFT([Exception Code/Category] ,2)) = 1 
+0

有也顯示,使該函數返回1的記錄的方式?而不是隻顯示計數?謝謝! – KateMak

回答

2

標量UDF,它在這種情況下接受兩個參數並返回單個值。 一些地區,在那裏你可以使用標量UDF:

  • 在SELECT或GROUP A柱表達
  • 搜索條件爲在一個JOIN FROM子句
  • 一個WHERE的搜索條件或HAVING子句

SELECT SUM(CAST(dbo.isErrorMismatch(LEFT(Type, 1), LEFT([Exception Code/Category],2)) AS int)) As MismatchCount 
FROM dbo.[All Service Ticket Data 2012_final] 
+0

+1因爲我喜歡這個比我的回答更好 –

+0

你好!非常感謝你張貼!我得到「多部分標識符」x.IsMatched「無法綁定」。你能解釋一下x是什麼嗎?謝謝! – KateMak

+0

@ user1461332 von v。answer中使用的「x.IsMatched」列,不是我的;) –

2

由於您的函數不是表類型或不返回表,因此您無法從中進行選擇,因此出現錯誤。但無論如何,你可以通過這樣實現它:

SELECT COUNT(*)    
FROM dbo.[All Service Ticket Data 2012_final] a 
     INNER JOIN 
      (
      SELECT isErrorMismatch(LEFT(Type, 1),LEFT([Exception Code/Category],2)) IsMatched, Your_PK_Column_or_Id 
      FROM dbo.[All Service Ticket Data 2012_final] 
      ) x ON x.Your_PK_Column_or_Id = a.Your_PK_Column_or_Id 
WHERE x.IsMatched = 1 

我只想補充一點,如果該值你傳遞一個值@theExCode不能被強制轉換爲INT話,會有在查詢例外。

+0

你好!感謝您的發表!我試圖理解這一點,並有幾個問題。我需要用任何東西來替換x嗎?另外,a是否代表表中的每條記錄?我不確定x和a是什麼意思..謝謝你的幫助! – KateMak

+0

'x'和'a'只是別名,我用它是因爲你有一個長表名。查詢不會顯示每條記錄,因爲您說你需要計數。但是如果你想獲得'每條記錄',那麼只需用'*'替換'COUNT(*)'。 –

+0

Ohhhhhhh我明白了!再次感謝你!! – KateMak

1

您需要結束CREATE FUNCTIONGO。此外,您的SELECT子查詢最後需要右括號。

(你的問題是關於語法錯誤)。

+0

是的,修復那些我能夠選擇正在使功能返回1的記錄!謝謝!!! – KateMak