2016-04-13 9 views
0

現在フィールド選択部分に数えているクエリがあります。MSSQLサブクエリまたは外部の複数の条件をカウントしますか?

SELECT userid, 
     (SELECT Count(*) AS Expr1 
     FROM dbo.relationships 
     WHERE (authorised IS NOT NULL 
       AND expired IS NULL 
       AND relationshipended IS NULL) 
       AND (mentorid = u.userid)) AS MenteeCount, 
     (SELECT Count(*) AS Expr1 
     FROM dbo.relationships AS Relationships_3 
     WHERE (authorised IS NULL) 
       AND (rejecteddate IS NULL) 
       AND (mentorid = u.userid)) AS UnansweredRequests 
FROM users 

同じ外部表から2つのカウントがあるので、外部適用を使用してこれを行う方が良いでしょうか?

CASE WHENを使用していますか?

+0

:Dすべての回答が競合しており、新しい解決策が追加されました! – chris

+0

私はMSSQLを使用しています – chris

答えて

0

はい。あなたは、単一のサブクエリで計算を実行する必要があります。

SELECT u.userid, r.MenteeCount, r.UnansweredRequests 
FROM users u OUTER APPLY 
    (SELECT SUM(CASE WHEN authorised IS NOT NULL AND expired IS NULL AND relationshipended IS NULL 
         THEN 1 ELSE 0 
       END) as MenteeCount 
      SUM(CASE WHEN authorised IS NULL AND rejecteddate IS NULL 
         THEN 1 ELSE 0 
       END) as UnansweredRequests 
     FROM dbo.relationships r 
     WHERE r.mentorid = u.userid 
    ) r ; 

その方法は、関係テーブルを要約するための処理は、各mentoridのために一度だけ行われます。相関句を指定する場合(サブクエリまたはapplyのいずれかの場合は、常に完全修飾列名を使用する必要があります)これは将来の問題を回避するのに役立つことに注意してください。

1

適用を使用する必要はありません。 :

SELECT 
    u.userId, 
    MenteeCount = SUM(CASE WHEN authorised IS NOT NULL AND expired IS NULL AND relationshipended IS NULL THEN 1 ELSE 0 END), 
    UnansweredRequests =SUM(CASE WHEN authorised IS NULL AND rejecteddate IS NULL THEN 1 ELSE 0 END) 
FROM 
    users u 
INNER JOIN 
    dbo.relationships r 
ON u.userid = mentorid 
関連する問題