2016-06-30 7 views
2
accounts table 
---------------- 

id name 
10 ABC Company  
11 XYZ Company 
12 LMN Company 
13 EFG Company 
14 JKL Company 
.. ........... 
.. ........... 

accounts_opportunities table 
----------------------- 
id opportunity_id account_id deleted 
1 1   11  0 
2 2   11  0 
3 3   12  0 
4 4   12  0 
5 5   13  0 
6 6   14  0 
. .   ..  . 
. .   ..  . 


opportunities table 
----------------- 
id name amount 
1 Opp 1 100 
2 Opp 2 50 
3 Opp 3 500 
4 Opp 4 600 
5 Opp 5 200 
6 Opp 6 1000 

上記の表の上位20個のアカウントを選択しようとしています。そして、私は2つの列を使用してSQLクエリを注文する方法は?

SELECT TOP 20 COUNT(*) as number_of_opportunities, 
    (
     SELECT accounts.name 
     FROM accounts 
     WHERE accounts.id=accounts_opportunities.account_id 
    ) as account_name 
FROM accounts_opportunities 
JOIN opportunities ON opportunities.id = accounts_opportunities.opportunity_id 
WHERE accounts_opportunities.deleted != '1' 
GROUP BY accounts_opportunities.account_id 
ORDER BY number_of_opportunities DESC 

とクエリ上記の出力以下与え、 に対して次のクエリを書かれました。

Account name Number of Opportunities 
------------ ----------------------- 
ABC Company  3 

XYZ Company  2 
LMN Company  2 

EFG Company  1 
JKL Company  1 

XYZとLMNは、同じ番号の機会を持っているが、私はXYZの機会のはLMN総未満の総量を算出した場合。また、JKLはEFGよりもの額が高い。

私の質問は、number_of_opportunities総機会量からこのクエリを注文する方法です。誰かが私にガイド..

予想される出力

Account name Number of Opportunities 
------------ ----------------------- 
ABC Company  3 
LMN Company  2 
EFG Company  1 
JKL Company  1 
XYZ Company  2 

答えて

1

をお願いすることができ、これを試してみてください:

SELECT TOP 20 a.name, COUNT(*) AS [Number of Opportunities] 
FROM accounts AS a 
INNER JOIN accounts_opportunities AS ao ON a.id = ao.account_id 
INNER JOIN opportunities AS o ON o.id = ao.opportunity_id 
WHERE ao.deleted != 1 
GROUP BY a.id, a.name 
ORDER BY COUNT(*) DESC, SUM(amount) DESC 

だから、あなたはDESCORDER BY句でSUM(amount)を追加することができます。 COUNT(*)の場合は、他の口座の上に金額の高い口座が置かれます。

+0

私はクエリをチェックしましたが、SUMは機能しません – user3099298

+0

@ user3099298提供されたサンプルデータを使ってクエリをテストしましたが正常に動作します。問題を再現できるようにデータを追加できますか? –

関連する問題