使用Where Criteria加入3个表

时间:2012-03-20 23:28:13

标签: sql sql-server join group-by where

我是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”。

1 个答案:

答案 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查询的一部分生成的引用“内部”,所以您不必担心其余数据发生奇怪的事情。