2012-03-20 15 views
1

私はSQLの初心者です.3つのテーブルを結合する際に問題が発生しました。3つのテーブルをどこで結合するのか

I 3つのテーブル

1)USER_MASTER(ユーザーID、FNAME、LNAMEを有する) これは

2コールセンター・エージェント・テーブルである)CALL_MASTER(callid、のCustomerName、電話、ユーザーID、呼び出しタイプ) この顧客の呼び出しが入る場合は、ユーザーIDは がコールをピックアップしているエージェントのリンクに使用され、呼び出しタイプは

としてコール

3)CALL_TYPE_MASTERの結果があります

私はこのクエリを試してみました。この

Agent name   Transferred routed disconnected 
Balang Hector   7   1   2 
Bonus Donna    0   1   2 
Dalino Marie   8   1   1 
Dela Cruz    0   0   1 

のようにそれをリストする:

SELECT 
USER_MASTER.FirstName,COUNT(CALL_MASTER.CallType) as Transferred 
FROM 
(USER_MASTER LEFT JOIN CALL_MASTER ON CALL_MASTER.UserID=USER_MASTER.USERID) 
WHERE 
CALL_MASTER.CallType=1 
GROUP BY 
USER_MASTER.FirstName 

しかし、問題は、私は、「ルーティング」と「転送」として別の行をリストアップする必要があるが、これはwhere句を変更することを意味し、明らかに見つからない場合は "0"を出力しません。

+0

この世界には誰かがいますか...私は何を言おうとしているのかを理解し、それに答える能力を持っていますか? T_T –

+0

'\(T_T)_ /' ???? –

答えて

3

これは、もちろん、かなり標準のPIVOTクエリです。

SELECT User_Master.name, [1] AS Transferred, [2] AS Routed, [3] AS Disconnected 
FROM (SELECT userId, callType 
     FROM Call_Master) Call_Master 
PIVOT(COUNT(callType) FOR callType IN ([1], [2], [3])) Pivoted 
JOIN User_Master 
    ON User_Master.userId = Pivoted.userId 

SQL Fiddle Demo

集計がUser_Masterに参加する前に起こっているように見えるので、クエリがCOUNT(*)を満たすためにインデックスを使用することができるはずです。ここではSQL Serverのバージョンより多くの慣用的です。残念ながら、列の別名を自動的に設定する方法はありません。動的SQLを使用する必要があります。


EDIT:

説明 -

(SELECT userId, callType 
FROM Call_Master) Call_Master 

このサブクエリは、集約をグループ化し、実行される上列のリストを取得しています。範囲チェックなどのための任意の条件を実行できます。その意図は、クエリがあなたがGROUP BYのために書くべきものでなければならないということです。

PIVOT(COUNT(callType) FOR callType IN ([1], [2], [3])) Pivoted 

この句は、前の表参照のためのシステム」を語っている、記載されている列の上に特定の集計を実行し、他の(潜在的に異なる)の列の変更ごとに、新しい列に結果を入れて"他のすべての列は、本質的にGROUP BY

  • に相当するものに含まれます

    • あなただけで列を指定することができますあなたが唯一集約関数を指定することができますいくつかの注意点があります。集計、および列(ここでは数学なし)。サブクエリのようなことをする必要があります
    • IN句の列のリストには、サブクエリから返されるすべての値が含まれている必要がありますが、結果のない列もあります。 [2]を省略すると、実行時エラーが発生しますが、[4]を追加するだけで0
    • ブラケットが必要とされているとあなたに列を取得し、FOR句で指定された列が文字である場合は、あなたが値の前後に引用符を使用しません。
    • 結果テーブルのエイリアスが必要です(Pivotedここにあります)。すべての列に関係します。クエリのこの時点では、Call_Master.userIdという列はありません。

      は、JOIN User_Master ON User_Master.userId = Pivoted.userId

    ...そして最後に、ユーザーIDを名前に変換するUser_Masterに参加します。集計はPivotクエリの一部として生成された参照の「内部」で発生するため、残りのデータには奇妙なことが起こることを心配する必要はありません。

  • +0

    私はコードを理解することができませんでした...しかし、それは完璧にmssqlで動作します。 –

    +0

    非常に非常に非常にありがとう...私はちょうど静的にcalltypesを追加する必要があります...とvb.netのアプリで私のコードを修正する必要があります... –

    +0

    うわー、ありがとう!あなたがコードで私を助けてくれても、あなたは私にそれを説明する時間をとったわけではありません!神のお恵みがありますように !!! –

    関連する問題