【问题标题】:SQL: Counting rows resulting from a joinSQL:计算连接产生的行数
【发布时间】:2014-04-08 14:18:19
【问题描述】:

我正在使用 SQL Server 2008 R2 并有以下查询。我基本上试图返回两列,员工的姓名和他们在当月拨打的电话总数的计数。我已经让查询运行了,但是当它运行时,它需要很长时间,并且它返回大量不正确的数字来计算总调用次数。任何人都可以帮我解决这个问题吗?

Select A.Name, count(1) As TotalCalls
From Calls B INNER JOIN Employees A on B.EmployeeID = A.TechID
Where A.Name IN ('Steven', 'John', 'Mark', 'Jason', 'Tom') 
AND Month(B.CreationDate) = Month(GetDate()) and Year(B.CreationDate) = Year(GetDate())
Group By A.Name

编辑: 我已经尝试了以下查询,我想我现在已经很接近了。它返回一个准确的结果集,我只是不确定如何让这个查询只查看当前月份。

Select A.Name, B.CallCount                                  
From Employees A Inner Join (Select EmployeeID, Count(*) As CallCount From Calls Group By EmployeeID) B
On A.TechID = B.EmployeeID
Where A.Name IN ('Steven', 'John', 'Mark', 'Jason', 'Tom') 
Group By A.Name, B.CallCount

【问题讨论】:

  • 您是否尝试在不使用 group by 的情况下运行查询以查看它是否返回预期的行?
  • 是的,它说“列 'A.Name' 在选择列表中无效,因为它不包含在聚合函数中并且没有 GROUP BY 子句。”
  • 抱歉复制粘贴错了,我已经编辑了我之前的评论。
  • 如果把count(1)和group by去掉怎么办?那必须工作。它是否返回预期结果?
  • 如果我拿走该组并计数,它只会列出相关技术名称的重复。我尝试计算调用表的唯一 ID,但它给了我以下错误。 “count 聚合操作不能将 uniqueidentifier 数据类型作为参数。”

标签: sql join count


【解决方案1】:

这个怎么样?

Select A.Name, count(A.name) As TotalCalls
From Calls B INNER JOIN Employees A on B.EmployeeID = A.TechID
Where A.Name IN ('Steven', 'John', 'Mark', 'Jason', 'Tom') 
AND Month(B.CreationDate) = Month(GetDate()) and Year(B.CreationDate) = Year(GetDate())
Group By A.Name
Order by TotalCalls

【讨论】:

  • 我很欣赏这项工作,并且该查询确实为每个技术返回了一个结果集。问题是 TotalCalls 返回的数字太大了,有几十万,我知道这是不对的。似乎它正在计算连接中的所有可能组合或类似的东西......
  • 那么,试着缩小范围。例如,尝试在特定月份接听 Steven 的电话,看看它是否结账。如果是这样,那么剩下的几个月呢?
  • 这里使用sqlfiddle.com。给我一组我可以使用的数据,看看我能不能帮忙
【解决方案2】:

想通了!非常感谢 Hal 和所有发表评论的人。

Select A.Name, B.CallCount                                  
From Employees A Inner Join (Select EmployeeID, Count(*) As CallCount From Calls Where Month(EntryDate) = Month(GetDate()) and Year(EntryDate) = Year(GetDate()) Group By EmployeeID) B
On A.TechID = B.EmployeeID
Where A.Name IN ('Steven', 'John', 'Mark', 'Jason', 'Tom') 
Group By A.Name, B.CallCount

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    相关资源
    最近更新 更多