2017-12-15 2 views
1

私はこのようなテーブル:2 COUNT()SQL Serverの間で比較する方法

Name Profit 
============== 
A  50 
A  -10 
A  60 

私は名前によってどのように多くのデータパーティションをカウントすると、私はどのように多くのデータだけが利益と比較します。上記のデータから、私はこのような結果を得るでしょう:

Name Total Profit Percentage 
=============================== 
A  3  2  66.7 

この問題を解決するために私を助けてください。前もって感謝します。

答えて

1

私はシンプルなGROUP BYクエリが動作するはずだと思う:

SELECT 
    Name, 
    COUNT(*) AS Total, 
    SUM(CASE WHEN Profit > 0 THEN 1 ELSE 0 END) AS Profit, 
    100.0 * SUM(CASE WHEN Profit > 0 THEN 1 ELSE 0 END)/COUNT(*) AS Percentage 
FROM yourTable 
GROUP BY 
    Name; 

自明ではないかもしれませんクエリの一部のみがCASE表現の合計です。この合計は、同じ名前を持つレコードの各グループについて、Profitがゼロ以外の値を持つ回数を示します。この手法は条件付集計と呼ばれ、パーセンテージを計算するときにもこの合計を再利用します。

0

このティムの答えの

declare @t table 
(
    Name varchar(10), 
    Profit int 
) 
insert into @t 
values('A',50),('A',60),('A',-10) 

SELECT 
    Name, 
    Profit = SUM(CASE WHEN Profit>0 THEN 1 ELSE 0 END), 
    Total = COUNT(1), 
    Average = (SUM(CASE WHEN Profit>0 THEN 1.0 ELSE 0.0 END)/COUNT(1))*100 
    FROM @t 
    GROUP BY Name 
+0

申し訳ありませんが、どちらも同じです。 –

1

やや拡張バージョン(すなわち、計算の繰り返しを排除)してみてください。エンジンが補充を最適化することができる

SELECT Name, Total, Profit, 100 * Profit/Total AS Percentage 
FROM (SELECT Name, 
      COUNT(*) AS Total, 
      SUM(CASE WHEN Profit > 0 THEN 1 ELSE 0 END) AS Profit 
     FROM yourTable 
     GROUP BY Name) q; 

が、それは可読性と保守性のために主にあります(計算を変更する必要がある場合)。この場合、それは1つの枯渇だけであるため、多くの利得はありませんが、いくつかの繰り返しである場合、この解決法がより有用になります。

保守性のポイントが明確でない場合は、会社の収益性の定義が変更され、今度は> 10が収益になると考えています。 Timのクエリでは、すべての計算を> 0から> 10に変更する必要があります。上記のクエリでは、1つの場所でのみ変更する必要があります。

+0

これは繰り返しの条件付き合計を排除しますが、追加の副照会を追加するとコストがかかります。一般に、このオプションはコードの可読性のためにのみ使用されますが、おそらくパフォーマンスのためではありません。 –

+0

@TimBiegeleisenはい、私は可読性と保守性について話していました。だから、私は「**いくらか**拡張版」と言っています。私の説明を参照してください。 –

+0

代わりに '100 * Profit/Total AS Percentage'を実行してください。 – jarlh

関連する問題