2012-03-20 59 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