質問
要するに、2つのテーブルがあります:
ユーザー:
------------------------
UserID | Name
------------------------
0 a
1 b
2 c
CALLS:
------------------------
ToUser | Result
------------------------
0 ANSWERED
1 ENGAGED
1 ANSWERED
0 ANSWERED
ETCなど(実際の結果には数値の参照を使用します)
特定のクライアントへの呼び出しの詳細を示す200万を超えるレコードがあります。現在、Caseステートメントを使用して、特定の結果の各再帰をカウントします。クイックカウントは既に完了しています。
COUNT(DISTINCT l_call_log.line_id),
COALESCE (SUM(CASE WHEN l_call_log.line_result = 1 THEN 1 ELSE NULL END), 0) AS [Answered],
COALESCE (SUM(CASE WHEN l_call_log.line_result = 2 THEN 1 ELSE NULL END), 0) AS [Engaged],
COALESCE (SUM(CASE WHEN l_call_log.line_result = 4 THEN 1 ELSE NULL END), 0) AS [Unanswered]
最初の合計カウント後にデータのスキャンを3回行っていますか?もしそうなら、私は1回の掃引を行い、一度に結果ごとの呼び出しを数える方法がありますか?
ありがとう。
解決
これには、1回の全表スキャンが必要です。
編集:答えるのに十分な情報がありません。以前に見逃していた重複除去(DISTINCT)のため、どの戦略が使用されるかわかりません。特にデータベースエンジンを知らない限り。
ほぼすべての主要なクエリエンジンで、各集計関数は各行の各列ごとに実行され、キャッシュされた結果(たとえば、COUNT(*)など)を使用する場合があります。
line_resultはインデックス付けされていますか?もしそうなら、より良いクエリ(GROUP BY + COUNT(*)を活用してインデックス統計を利用できますが、クエリの他のテーブルに依存する価値があるかどうかはわかりません。
他のヒント
SQLには GROUP BY
構造があります。試してください:
SELECT COUNT(DISTINCT l_call_log.line_id)
GROUP BY l_call_log.line_result
依存するサブクエリがないため、テーブルスキャンだと思います。確認するには、クエリでExplainを実行します。
所属していません StackOverflow