2014-09-04 126 views
-1

SQL Server中的CASE WHEN語法存在問題。我從下面的語法做錯了嗎?我在SQL Server的視圖上使用這種語法。檢查語法如下:CASE WHEN語法SQL Server 2008

SELECT 
    t1.ID , 
    t1.ClassID , 
    t1.theDate , 
    t1.theTime , 
    t1.Number01 , 
    MAX(t2.Number01) AS Prev_Number01 , 
    CASE 
     WHEN ((t1.Number01 - MAX(t2.Number01)) < 0 
      THEN (100000  - (MAX(t2.Number01)) + t1.Number01) , 
       (t1.Number01 - MAX(t2.Number01))) 
    END AS _Number01 , 
    t1.Number02 , 
    MAX(t2.Number02) AS Prev_Number02 , 
    CASE 
     WHEN ((t1.Number02 - MAX(t2.Number02)) < 0 
      THEN (100000  - (MAX(t2.Number02)) + t1.Number02) , 
       (t1.Number02 - MAX(t2.Number02))) 
    END AS _Number02 , 
    CONVERT(Decimal(18,3) , 
     ( t1.Number01 
      - MAX(t2.Number01) 
     )/
     POWER(
      POWER(
      COALESCE(t1.Number01 - MAX(t2.Number01) , 0) , 
      2) 
      + POWER(
       COALESCE(t1.Number02 - MAX(t2.Number02), 0) , 
       2) , 
      0.5 
     ) 
     ) AS _NumberA , 
    t1.Number03 , 
    t1.Number04 , 
    t1.Number05 , 
    t1.AD , 
    t1.GM , 
    MAX(t2.GM) AS Prev_GM , 
    t1.GM - MAX(t2.GM) AS AX , 
    t1.DC , 
    t1.MW , 
    t1.ULH , 
    t1.UL , 
    CONVERT(Decimal(18,3), 
     t1.MW/POWER(POWER(t1.MW,2) + POWER(t1.UL,2) , 0.5) 
     ) AS UT , 
    t1.RE , 
    t1.FV , 
    t1.TG , 
    t1.NM , 
    t1.CK 
FROM    
    dbo._CTProduction AS t1 
LEFT OUTER JOIN 
    dbo._CTProduction AS t2 ON t2.ClassID = t1.ClassID 
          AND t2.Number01 < t1.Number01 
          AND t2.Number02 < t1.Number02 
          AND t2.GM < t1.GM 
GROUP BY 
    t1.ID, t1.ClassID, t1.theDate, t1.theTime, 
    t1.Number01, t1.Number02, t1.Number03, t1.Number04, t1.Number05, 
    t1.AD, t1.GM, t1.DC, t1.MW, t1.ULH, t1.UL, 
    t1.RE, t1.FV, t1.TG, t1.NM, t1.CK 

這是錯誤消息:

消息156,級別15,狀態1,行中的關鍵字 '然後' 4
附近有語法錯誤。

另外還有一條CASE聲明在第6行。它與第4行相同。任何人都可以幫助解決這個問題?

+0

你看了嗎? ([CASE(Transact-SQL)](http://technet.microsoft.com/en-us/library/ms181765.aspx)) – 2014-09-04 02:11:20

回答

2

這是case聲明:

CASE WHEN ((t1.Number01 - MAX(t2.Number01)) < 0 
    THEN (100000 - (MAX(t2.Number01)) + t1.Number01), 
(t1.Number01 - MAX(t2.Number01))) END AS _Number01, t1.Number02, 
MAX(t2.Number02) AS Prev_Number02, 

這是不正確的。我不知道你想要什麼,但是這是語法正確:

(CASE WHEN t1.Number01 - MAX(t2.Number01) < 0 
     THEN 100000 - MAX(t2.Number01) + t1.Number01 
     ELSE t1.Number01 - MAX(t2.Number01) 
END) AS _Number01, t1.Number02, 
MAX(t2.Number02) AS Prev_Number02, 

換句話說,逗號不是語法的一部分,你缺少的else(如果這是你的意圖)。

+0

很好,仍然錯誤伴侶。我以爲我想念「ELSE」.. – Haminteu 2014-09-04 02:34:37

+0

@Haminteu。 。 。你也有不匹配的括號。我刪除了無關的來簡化查詢。 – 2014-09-04 02:36:15

0

您錯過了ELSE短語。相反,您已經輸入了逗號,然後是替代值。

CASE WHEN (t1.Number01 - MAX(t2.Number01)) < 0 
    THEN (100000 - MAX(t2.Number01) + t1.Number01) 
    ELSE (t1.Number01 - MAX(t2.Number01)) 
END 

CASE聲明文檔可以找到here

0

如果你重排你的代碼,使其接近可讀性(看看我上面的編輯),你可能會注意到在你的whenthen子句中都有不平衡的括號。更不用說then子句試圖返回一個通信分隔的值集合。

+0

嗯,不平衡?在哪一行? – Haminteu 2014-09-04 02:28:22