からMAXはあなたが、行の数十万人との「カーズ」のテーブルを持っていた 、あなたは、GROUP BYをやってみたかったと仮定し、次のとおりですCOUNTとBY T-SQL GROUPにして、COUNT
SELECT CarID
, CarName
, COUNT(*) AS Total
FROM dbo.tbl_Cars
GROUP BY CarID
, CarName
グループ化すると、次のような結果が得られます。
CarID CarName Total
1872 Olds 202,121
547841 BMW 175,298
9877 Ford 10,241
すべての問題はありません。
CarID CarName Total Max Total
1872 Olds 202,121 202,121
547841 BMW 175,298 202,121
9877 Ford 10,241 202,121
一つのアプローチ:あなたのような結果を持っているので、 私の質問は、しかし、一つのテーブルに 合計とMAXの合計を取得するための最良の方法は、パフォーマンスと きれいなコーディングの面で、あるものですGROUPの結果をテンポラリテーブル に入れ、テンポラリテーブルからMAXをローカル変数に取得します。 しかし、私はこれを行うための最良の方法は何だろうと思っています。
UPDATE
共通テーブル式を書くのは最もエレガントなようで、@EBarrにまだ同様の 、私の限られたテストでは、大幅にパフォーマンスの低下を示しています。 だから私はCTEと一緒に行くつもりはありません。
リンク@EBarrのCOMPUTE
オプションでは、機能 が推奨されていないことを示しているため、これは最適なルートではありません。
MAX値のローカル変数のオプションと テンポラリテーブルを使用すると、パフォーマンスの問題を認識していないので、私がダウンするルートになる可能性があります。
私の使用事例についてもう少し詳しく:おそらく シリーズの他の質問になる可能性があります。しかし、 のデータの大きなサブセットを一時テーブルにロードする(つまり、tbl_Carsのサブセットが#tbl_Carsに入る であり、さらに#tbl_Carsがさらにフィルタリングされて になる可能性があります)。複数の結果セットを返す単一のストアドプロシージャ 内で複数のフィルタリング と集約クエリを実行する必要があります。
UPDATE 2
ウィンドウ機能のEBarrの使用@素晴らしく、短いです。自己への注意: 外部参照テーブルにRIGHT JOIN
を使用する場合、COUNT()
関数は、'*'
ではなく、tbl_Carsから列を選択する必要があります。速度の点で
SELECT M.MachineID
, M.MachineType
, COUNT(C.CarID) AS Total
, MAX(COUNT(C.CarID)) OVER() as MaxTotal
FROM dbo.tbl_Cars C
RIGHT JOIN dbo.tbl_Machines M
ON C.CarID = M.CarID
GROUP BY M.MachineID
, M.MachineType
、それは細かいようだが、どの時点で、あなたは、読み込みの数に関する 心配する必要はありますか?
あなたは、インデックス付きビューで 'MAX'を使用することはできません(私がしてきました5年間それを求める - http://connect.microsoft.com/SQLServer/feedback/details/267516/expand-aggregate-support-in-indexed-views-min-max)。また、 'theFieldBeingSearchedForMax'はテーブルにはありません、出力の一部です(最高のカウントです)。 –
質問をもう一度読んでください。私はそれを誤って読んだ。 SQLの更新。 – EBarr
- 申し訳ありませんが、最初のクエリでGROUP BYを追加できませんでした。私の悪い。 – mg1075