2017-08-02 59 views
0

我想選擇stateworkstate列。首選使用state值。如果它爲空或空,那麼我想使用workstate值。如果爲空或空,請選擇不同的列

我有以下SQL:

SELECT   
COUNT(id) AS participants, 

COALESCE(NULLIF(state,''), workState, (select state from dbo.training where id =(SELECT top(1) trainingId 
    FROM dbo.Xref_Participant_Training 
    WHERE (participantId = dbo.Participant.id)))) as state 

FROM dbo.Participant 
WHERE EXISTS 
    (SELECT 1 
     FROM dbo.Xref_Participant_Training 
     WHERE (participantId = dbo.Participant.id) AND (dbo.Participant.country = 'United States')) 
GROUP by COALESCE(NULLIF(state,''), workState, (select state from dbo.training where id =(SELECT top(1) trainingId 
     FROM dbo.Xref_Participant_Training 
     WHERE (participantId = dbo.Participant.id)))) 

我收到以下錯誤:

Msg 144, Level 15, State 1, Line 15 
Cannot use an aggregate or a subquery in an expression used for the group by list of a GROUP BY clause. 
+1

包括分組中的工作狀態。 –

+0

在「GROUP BY」中指定相同的'COALESCE'表達式。 –

+0

您可能希望將合併的最後一部分更改爲外部應用,而不是子查詢,以便結果可以包含在組中。 – ZLK

回答

0

變化GROUP BY包括整個表達式

SELECT   
     COUNT(id) AS participants, 
     COALESCE(NULLIF(state,''), workState) as state 
FROM dbo.Participant 
WHERE EXISTS 
    (SELECT participantId 
     FROM dbo.Xref_Participant_Training 
     WHERE (participantId = dbo.Participant.id) AND (dbo.Participant.country = 'United States')) 
GROUP BY COALESCE(NULLIF(state,''), workState) 

爲您更新的查詢,當查詢變得複雜時,使用派生表或cte

爲派生表

select col1, col2, count(*) 
from 
(
    select col1, col2 = coalesce(col2, col3), col4, col5 
    from sometable 
) d 
group by col1, col2 
+0

是可行的。我想進一步擴展到最終狀態。看到我更新的查詢。 – codeNinja

1

這個例子中的語法是將原始問題的答案。

的問題是,你需要把在group by整個表達式:

SELECT COUNT(id) AS participants, 
     COALESCE(NULLIF(p.state,''), p.workState) as state 
FROM dbo.Participant p 
WHERE EXISTS (SELECT 1 
       FROM dbo.Xref_Participant_Training pt 
       WHERE pt.participantId = p.id 
      ) AND 
     p.country = 'United States' 
GROUP BY COALESCE(NULLIF(p.state, ''), p.workState); 

與您的查詢的問題是,GROUP BY state真正意義GROUP BY p.state。但是,您想按照SELECT中定義的列進行聚合。

另外:

  • 表的別名使查詢更容易編寫和閱讀。
  • 您不需要EXISTS子查詢的列名稱。
+0

好吧,如果我有3個選項會發生什麼。查看我的更新查詢 – codeNinja

+3

@codeNinja。 。 。在問題得到解答後更改問題是粗魯的。它使答案無效,並且可以繪製downvotes。如果你有另一個問題,你應該問另一個問題。 –

相關問題