質問

要するに、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を実行します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top