2012-03-20 60 views
1

我是新來的sql和我遇到了連接3個表的問題。加入3表格與哪裏標準

我有3個表

1)USER_MASTER(用戶ID,FNAME,L-NAME) 這是呼叫中心代理表

2)CALL_MASTER(呼叫ID,客戶名稱,電話,用戶ID,CALLTYPE) 此是哪裏的客戶來電進入,使用用戶ID鏈接 選取了哪些代理了電話,CALLTYPE是呼叫

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 – 2012-03-20 23:45:38

+0

'\(T_T)_ /' – 2012-03-21 16:19:55

回答

3

這當然是一個相當標準的PIVOT查詢。這裏有一個版本更地道的SQL Server:

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。


編輯:

解釋 -

(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

...最後,一個加盟User_Master將用戶ID轉換爲名稱。請注意,因爲聚合發生在作爲Pivot查詢的一部分而生成的引用「內部」,所以您不必擔心發生在其他數據上的奇怪事情。

+0

我無法理解代碼......但它完美地運行在mssql上。 – 2012-03-20 23:48:56

+0

非常非常感謝你......從這裏開始,我只需要靜態添加calltype ...並修改我的代碼在vb.net應用程序即時通訊工作... – 2012-03-20 23:50:03

+0

哇謝謝很多!即使你在代碼中幫助我,你也花了你的時間向我解釋!上帝祝福你 !!! – 2012-03-24 18:44:27