2017-09-29 20 views
3

私は現在持っている:SQL ServerでSUM over GROUP BYを使用する方法?

SELECT Name, COUNT(*) as Total 
FROM DataTable 
WHERE Name IN ('A', 'B', 'C') 
GROUP BY Name 

出力結果:ここでは10

Name Total 
-------------- 
A  10 
B  10 
C  10 

の2 + 5 + 3(合計数の合計です:

Name Total 
-------------- 
A  2 
B  5 
C  3 

は、代わりに私はこれがしたいの名前= A/B/Cのレコード)

どうすればよいですか?

+1

'のためにこの数字を表示するポイントは何'、' b'、 'c'を個別に使う?あなたは要件の背後にある論理を説明できますか? – Mureinik

+0

実際、実際のクエリでは、オフセットとリミットを使用して最初の10レコードしか取得しませんでした。次に実行するのは次の10レコードです。 ページングの目的でレコードの総数を表示するには合計カウントが必要です。 –

答えて

7

に参加しない場合。 Demo

SELECT Name, 
     SUM(COUNT(*)) OVER() as Total 
FROM DataTable 
WHERE Name IN ('A', 'B', 'C') 
GROUP BY Name 
+1

大きなデータセットで、これがどのように比較されるかについてのアイデアは、「distinct ... count(*)over()」ですか?実際のシンプルなサンプルデータでは、プランは類似しています(シフトされたソート演算子の配置)。 [dbfiddle.uk](http://dbfiddle.uk/?rdbms=sqlserver_2016&fiddle=605b51a0e0edd266c9ed2e5ec037691e) – SqlZim

+0

答えをありがとう、私はパフォーマンスに関して同じことを思っていた。 –

+0

@SqlZim私はIPadにいるので、計画をテストして見ることはできません。これは、行数を早く減らすことができるので、これが望ましいと思います。私はあなたのための計画がテーブル全体と同じように多くの行をスプールするかもしれないと想像していますか? –

1

あなたはすべてのレコードをカウントして、クロスあなたがグループ化されたCOUNT(*)SUM() OVER()を使用することができ、あなたの目的の結果を得るには、すべて異なる名前

SELECT a.NAME 
    ,x.Total 
FROM DataTable a 
CROSS JOIN (
    COUNT(*) AS Total FROM DataTable 
    ) x 
GROUP BY a.NAME 
    ,x.Total 
4

distinctgroup byを取り除くと使用しなさい:

select distinct Name, count(*) over() as Total 
from t 
where name in ('A', 'B', 'C') 

rextesterデモ:http://rextester.com/WDMT68119

リターン:

+------+-------+ 
| name | Total | 
+------+-------+ 
| A | 10 | 
| B | 10 | 
| C | 10 | 
+------+-------+