2015-12-04 34 views
1

我有下面寫的查詢。多個表達式在sql查詢中使用case exprssion

SELECT T1.[AcctCode],T1.[Segment_0],SUM(T0.[DebLTotal]) AS BUDGET, SUM(T3.[Debit]) AS DEBIT, 
     AcctName = CASE WHEN T1.[Segment_0] LIKE '6001%%' THEN 'Operating Cost' 
         WHEN T1.[Segment_0] LIKE '6002%%' THEN 'Operating Cost' 
         WHEN T1.[Segment_0] LIKE '6003%%' THEN 'Operating Cost' 
         WHEN T1.[Segment_0] LIKE '6004%%' THEN 'Operating Cost' 
         WHEN T1.[Segment_0] LIKE '6005%%' THEN 'Operating Cost' 
         WHEN T1.[Segment_0] LIKE '6006%%' THEN 'Operating Cost' 
     ELSE T1.[AcctName] END 
FROM OBGT T0 INNER JOIN OACT T1 ON T0.[AcctCode]=T1.[AcctCode] INNER JOIN OBGS T2 
ON T0.[Instance] = T2.[AbsId] INNER JOIN JDT1 T3 ON T1.[AcctCode] = T3.[Account] INNER JOIN OASC T4 ON T1.[Project]=T4.[Code] 
where T1.[Segment_0] like '60%%' 
GROUP BY T1.[AcctCode],T1.[Segment_0],T1.[AcctName] 

此查詢爲我提供了不同的運營成本值。我需要類似WHEN T1.[Segment_0] LIKE '6002%%,6003%%,6004%%' THEN 'Operating Cost'。可能嗎?我不需要一個接一個的喜歡。作爲運營成本,我需要一切。請幫我解決這個問題。

+0

請編輯您的問題並提供樣本數據和期望的結果。目前尚不清楚你想要做什麼。 –

+0

簡而言之,如果segment_0從6開始,那麼賬戶名稱應該是運營成本。當我將案件提升至'6006'時,我得到多行。我只需要一行。 @GordonLinoff – Kirat

+1

等等,我們真的在說什麼「從6開始」?正如'LIKE'6%''就足夠了嗎? –

回答

1

如果T1.[Segment_0]只是數值您可以使用此語法與between

case when substring(T1.[Segment_0], 1, 4) between 6001 and 6006 then 'Operating Cost' else T1.[AcctName] end 

否則,您可以使用IN

case when substring(T1.[Segment_0], 1, 4) in ('6001','6002','6003','6004','6005','6006') then 'Operating Cost' else T1.[AcctName] end 
3

也許你的問題是,你在group byAcctName而不是case的結果。也許這你想要做什麼:

SELECT T1.[AcctCode],T1.[Segment_0],SUM(T0.[DebLTotal]) AS BUDGET, SUM(T3.[Debit]) AS DEBIT, 
     AcctName = (CASE WHEN T1.[Segment_0] LIKE '6001%%' THEN 'Operating Cost' 
         WHEN T1.[Segment_0] LIKE '6002%%' THEN 'Operating Cost' 
         WHEN T1.[Segment_0] LIKE '6003%%' THEN 'Operating Cost' 
         WHEN T1.[Segment_0] LIKE '6004%%' THEN 'Operating Cost' 
         WHEN T1.[Segment_0] LIKE '6005%%' THEN 'Operating Cost' 
         WHEN T1.[Segment_0] LIKE '6006%%' THEN 'Operating Cost' 
        ELSE T1.[AcctName] END) 
FROM OBGT T0 INNER JOIN OACT 
    T1 
    ON T0.[AcctCode]=T1.[AcctCode] INNER JOIN 
    OBGS T2 
    ON T0.[Instance] = T2.[AbsId] INNER JOIN 
    JDT1 T3 
    ON T1.[AcctCode] = T3.[Account] INNER JOIN 
    OASC T4 
    ON T1.[Project] = T4.[Code] 
where T1.[Segment_0] like '60%%' 
GROUP BY T1.[AcctCode], T1.[Segment_0], 
     (CASE WHEN T1.[Segment_0] LIKE '6001%%' THEN 'Operating Cost' 
       WHEN T1.[Segment_0] LIKE '6002%%' THEN 'Operating Cost' 
       WHEN T1.[Segment_0] LIKE '6003%%' THEN 'Operating Cost' 
       WHEN T1.[Segment_0] LIKE '6004%%' THEN 'Operating Cost' 
       WHEN T1.[Segment_0] LIKE '6005%%' THEN 'Operating Cost' 
       WHEN T1.[Segment_0] LIKE '6006%%' THEN 'Operating Cost' 
       ELSE T1.[AcctName] 
      END); 

編輯:

您可能還需要從selectgroup by,既除去Segment_0。沒有樣本數據,很難說。

+0

我需要AcctName =(CASE當T1。[Segment_0] LIKE'6001 %%和6002 %%,6003 %%'THEN'運營成本')。我需要這個東西。而不是把不同的喜歡,我需要一個行結果。如果segment_0像6002 %%,6003 %%那麼acctname應該是運營成本 – Kirat

+0

@Kirat。 。 。把'case'放在'group by' *而不是*'ACCTNAME'中應該做你想要的。 –

2

SQL服務器等做pattern matching

嘗試CASE WHEN T1.[Segment_0] LIKE '600[123456]%%' THEN 'Operating Cost'

+1

+1。不過,不知道如何保留原始問題中的'%%'。 *兩個*零個或多個字符的字符串? –

+0

與此我仍然得到相同result.as我提出疑問 – Kirat