2017-01-25 6 views
0

私は、SUM(CallCount)によって「カテゴリ」のTOP 7を取得するスクリプトを持っています。TSQL TOP番号

SELECT TOP (ISNULL(CAST(7 AS INT), 0)) 
    F.Category, 
    CallCount = SUM(F.callcount) 
FROM 
    #FINAL F 
GROUP BY 
    F.Category 
ORDER BY 
    SUM(F.CallCount) DESC 

enter image description here

合計CallCountは2679703であり、私は100%に合計する必要があり%を取得するために2679703によって各合計カテゴリの呼び出し回数を分割する必要がありますが、私はちょうど組み込む方法がわかりません以下のコードで合計CallCountは2,679,703です。

enter image description here

TtlCountとCallCount全体の合計が一致しなければならないとCallCountPercentは100%に合計べきです。

答えて

0

。私は、テーブルの行セットを分割し、合計を得るためにダミー値を選択するためにoverを使用しています。

SELECT TOP (ISNULL(cast(7 as int),0)) F.Category, 
     SUM(F.callcount) OVER (PARTITION BY F.category) as callcount, 
     (SUM(F.callcount) OVER (PARTITION BY(SELECT 0))) as Totalcount 
    ,CAST(1. * F.callcount/ SUM(F.callcount) OVER(PARTITION BY (SELECT 0)) *100 AS DECIMAL(5,2)) as percentage 
FROM #FINAL F 
order by F.CallCount desc 

これにより、大規模なデータセットでも優れた実行計画が得られます。 enter image description here

+0

上記のサンプルでは合計パーセントが100%に達していません。私は今のところ働いている。私はトップXを使っているので、最初に#tempテーブルに置く必要があります。次に、レコードのトップXの%を取得するために除算を行います。返信ありがとう:) – Arsee

+0

@Arsee、私はそれを100%になるように丸める必要があります。変更されたスクリプトを参照して今すぐ出力してください。 –

0

あなたは、総コール数の合計を見つけ、サブクエリで割ることができます:ただの数字を合計して、グループを排除するための別の方法を示すために、

SELECT TOP ISNULL(cast(7 as int), 0) F.Category, 
      SUM(F.callcount) AS CallCount, 
      100 * SUM(F.callcount)/
       (SELECT SUM(callcount) FROM #FINAL) AS CallCountPercent 
FROM #FINAL F 
GROUP BY F.Category 
ORDER BY SUM(F.CallCount) desc 
+0

コードは機能しましたが、結果をテンポラリテーブルに配置してからそのテンポラリテーブルをクエリする必要があります。それはカテゴリのトップXを引っ張っているからです。 – Arsee

+0

@Arseeだから私は何かを更新するために探していますか? –

+0

私は良いです..私はちょうど最終結果のための一時テーブルを使用して合計を組み込むために1行のコードを構築する必要があります。助けてくれてありがとう。感謝します。 :) – Arsee