我是sql的新手,我遇到了加入3个表的问题。
我有3张桌子
1)USER_MASTER(userid,fname,lname) 这是呼叫中心座席表
2)CALL_MASTER(callid,customername,phone,userid,calltype) 这是客户呼叫进入的地方,用户ID用于链接哪个代理 拿起电话,calltype是电话的结果
3)CALL_TYPE_MASTER为
calltype typename
1 transferred
2 routed
3 disconnected
我想像这样列出
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 :(得分: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
s FOR
子句中给出的列是字符,则不要在值周围使用引号。需要结果表的别名(此处为Pivoted
),并且对所涉及的所有列有效。此时查询中没有Call_Master.userId
列。
加入User_Master ON User_Master.userId = Pivoted.userId
...最后,加入User_Master
将用户ID转换为名称。请注意,因为聚合发生在作为Pivot
查询的一部分生成的引用“内部”,所以您不必担心其余数据发生奇怪的事情。