【问题标题】:Joining 3 Tables With Where Criteria使用 Where 条件连接 3 个表
【发布时间】:2012-04-05 11:53:48
【问题描述】:

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

【问题讨论】:

  • 这个世界上是否有人......有能力理解我想说的......并回答它? T_T

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


【解决方案1】:

当然,这是一个相当标准的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] 只会让你得到一个带有0s 的列
  • 括号是必需的,如果FOR 子句中给出的列是字符,则不要在值周围使用引号。
  • 结果表的别名(此处为Pivoted)是必需的,并且对所涉及的所有列有效。此时查询中没有Call_Master.userId 列。

    加入 User_Master ON User_Master.userId = Pivoted.userId

...最后,加入User_Master 以将用户ID 转换为名称。请注意,由于聚合发生在作为 Pivot 查询的一部分生成的引用“内部”,因此您不必担心其他数据会发生奇怪的事情。

【讨论】:

  • 我无法理解代码......但它在 mssql 上完美运行。
  • 非常非常非常感谢...从这里开始我只需要静态添加调用类型...并在我正在开发的 vb.net 应用程序上修改我的代码...
  • 哇非常感谢!!!甚至您在代码中都没有帮助我,您还花时间向我解释!上帝保佑你!!!
猜你喜欢
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 2019-03-15
  • 2015-10-26
  • 2021-03-12
  • 1970-01-01
  • 2018-01-20
  • 1970-01-01
相关资源
最近更新 更多