子查询中的SQL Group By语句
我试图编写一个查询,返回每个员工每月进行的“主动呼叫案例”的数量以及所有案例的总数。基本上,我希望返回3列;一个EmployeeName,该月的主动呼叫数,以及该月的总呼叫数。为了尝试实现这一点,我使用了一个子查询。以下是我到目前为止的情况:子查询中的SQL Group By语句,sql,sql-server,group-by,subquery,Sql,Sql Server,Group By,Subquery,我试图编写一个查询,返回每个员工每月进行的“主动呼叫案例”的数量以及所有案例的总数。基本上,我希望返回3列;一个EmployeeName,该月的主动呼叫数,以及该月的总呼叫数。为了尝试实现这一点,我使用了一个子查询。以下是我到目前为止的情况: Select OpenedByName AS EmployeeName, Count(OpenedByName) As NumberOfProactiveCallsMONTH, (Select Count(OpenedByName) From t
Select OpenedByName AS EmployeeName, Count(OpenedByName) As NumberOfProactiveCallsMONTH,
(Select Count(OpenedByName)
From table1
Where OpenDate Between '2/1/2014' and '3/1/2014' Group By OpenedByName) AS
TotalTicketsMONTH
From table1
Where OpenDate Between '2/1/2014' and '3/1/2014' AND ProblemType = 17
Group By OpenedByName
运行查询后,我得到的错误是:
"Msg 512, Level 16, State 1, Procedure SalesMTDSubQuery, Line 7 Subquery returned
more than 1 value. This is not permitted when the subquery follows =, !=, <, <= ,
>, >= or when the subquery is used as an expression."
“Msg 512,级别16,状态1,过程SalesMTDSubQuery,返回第7行子查询
超过1个值。当子查询后跟=、!=、=或子查询用作表达式时,不允许使用此值。“
我认为它返回这个错误是因为我在子查询中添加了GroupBy语句。当我删除GroupBy时,它只会为每个员工返回相同的值。我对使用SQL还相当陌生,所以我不确定有什么好方法可以解决这个问题。任何帮助都将不胜感激
谢谢 您需要将子选择与外部语句关联起来,否则,正如您所注意到的,您会在子选择中返回多行不起作用的语句
SELECT OpenedByName AS EmployeeName
, COUNT(OpenedByName) AS NumberOfProactiveCallsMONTH
, ( SELECT COUNT(OpenedByName)
FROM table1 b
WHERE OpenDate BETWEEN '2/1/2014' AND '3/1/2014'
AND b.OpenedByName = a.OpenedByName
GROUP BY OpenedByName
) AS TotalTicketsMONTH
FROM table1 a
WHERE OpenDate BETWEEN '2/1/2014' AND '3/1/2014'
AND ProblemType = 17
GROUP BY OpenedByName
但通过使用条件和而不是子选择,您可以大大简化这一过程:
SELECT OpenedByName AS EmployeeName
, SUM(ProblemType = 17) NumberOfProactiveCallsMONTH
, COUNT(OpenedByName) AS TotalTicketsMONTH
FROM table1
WHERE OpenDate BETWEEN '2/1/2014' AND '3/1/2014'
GROUP BY OpenedByName
像这样的怎么样
SELECT OpenedByName AS EmployeeName,
SUM(CASE WHEN ProblemType = 17 THEN 1 ELSE 0 END) AS NumberOfProactiveCallsMONTH,
COUNT(1) TotalTicketsMONTH
FROM Table1
Where OpenDate Between '2/1/2014' and '3/1/2014'
GROUP BY OpenedByName
Select OpenedByName AS EmployeeName, Count(OpenedByName) As NumberOfProactiveCallsMONTH,
(Select Count(OpenedByName)
From table1 t
Where OpenDate Between '2/1/2014' and '3/1/2014'
AND t.OpenedByName = t1.OpenedByName) AS
TotalTicketsMONTH
From table1 t1
Where OpenDate Between '2/1/2014' and '3/1/2014' AND ProblemType = 17
Group By OpenedByName
收到的错误是由于将子查询用作列时,它不能返回超过1个值
现在按照您构建它的方式,它将返回每个OpenedByName的所有COUNT
值,而不是每个OpenedBy返回一个值
如果您确实希望使用query,则需要将select列中的查找限制为实际的OpenedByName。大概是
SELECT OpenedByName AS EmployeeName,
SUM(CASE WHEN ProblemType = 17 THEN 1 ELSE 0 END) AS NumberOfProactiveCallsMONTH,
COUNT(1) TotalTicketsMONTH
FROM Table1
Where OpenDate Between '2/1/2014' and '3/1/2014'
GROUP BY OpenedByName
Select OpenedByName AS EmployeeName, Count(OpenedByName) As NumberOfProactiveCallsMONTH,
(Select Count(OpenedByName)
From table1 t
Where OpenDate Between '2/1/2014' and '3/1/2014'
AND t.OpenedByName = t1.OpenedByName) AS
TotalTicketsMONTH
From table1 t1
Where OpenDate Between '2/1/2014' and '3/1/2014' AND ProblemType = 17
Group By OpenedByName
你可以这样用
Select a.OpenedByName AS EmployeeName, Count(a.OpenedByName) As NumberOfProactiveCallsMONTH,
b.TotalTicketsMONTH AS TotalTicketsMONTH
From table1 a
INNER JOIN
(Select OpenedByName ,Count(OpenedByName) AS TotalTicketsMONTH From table1
Where OpenDate Between '2/1/2014' and '3/1/2014' Group By OpenedByName) b ON
a.OpenedByName = b.OpenedByName
Where a.OpenDate Between '2/1/2014' and '3/1/2014' AND a.ProblemType = 17
Group By a.OpenedByName
您需要将一个关系从内部查询放到外部查询:
SELECT t1.OpenedByName AS EmployeeName,
COUNT(t1.OpenedByName) As NumberOfProactiveCallsMONTH,
( SELECT COUNT(OpenedByName)
FROM table1 t2
WHERE t2.OpenDate BETWEEN '2/1/2014' AND '3/1/2014'
AND t1.OpenedByName = t2.OpenedByName
) AS TotalTicketsMONTH
FROM table1 t1
WHERE t1.OpenDate BETWEEN '2/1/2014' AND '3/1/2014'
AND t1.ProblemType = 17
GROUP BY t1.OpenedByName;
但是,您可以通过使用条件聚合来简化查询(即,仅当满足其他条件时才计算):
下一个改进是将您的日期格式更改为非特定文化的日期格式-是2/1/2014
1月2日还是2月1日?如果使用yyyyMMdd
,则没有歧义
最后,您的查询将包括3月1日午夜打开的票据,我怀疑这些票据不应包含在2月份的数据中,您最好使用
=
和`子查询的目的是什么?如果您按OpenedName分组,然后获得一个计数,这还不够吗?这是我使用的解决方案,效果非常好。我只是想知道问题的一部分。获得每月总票数的计数(1)是多少?谢谢