Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
子查询中的SQL Group By语句_Sql_Sql Server_Group By_Subquery - Fatal编程技术网

子查询中的SQL Group By语句

子查询中的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

我试图编写一个查询,返回每个员工每月进行的“主动呼叫案例”的数量以及所有案例的总数。基本上,我希望返回3列;一个EmployeeName,该月的主动呼叫数,以及该月的总呼叫数。为了尝试实现这一点,我使用了一个子查询。以下是我到目前为止的情况:

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)是多少?谢谢