Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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 Server连接到子查询_Sql_Sql Server - Fatal编程技术网

Sql Server连接到子查询

Sql Server连接到子查询,sql,sql-server,Sql,Sql Server,我有一个带有呼叫记录的SQL Server表,我想得到总呼叫数和总应答呼叫数 下面是该表的外观: Extension | Status ----------------------- 300 Answered 200 Not Answered .... ... 编写查询以返回分机名、总呼叫数(整个表中的计数)和已应答呼叫数(count whereStatus='responsed')的最有效方法是什么 我创建了一个子查询并加入它,但它似乎有点低

我有一个带有呼叫记录的SQL Server表,我想得到总呼叫数和总应答呼叫数

下面是该表的外观:

 Extension | Status
 -----------------------
 300        Answered
 200        Not Answered
 ....       ...
编写查询以返回分机名、总呼叫数(整个表中的计数)和已应答呼叫数(count where
Status='responsed'
)的最有效方法是什么

我创建了一个子查询并加入它,但它似乎有点低效,所以我

    SELECT Extension, COUNT(*) AS total, answered.num as totalAnswered 
    FROM calls c INNER JOIN (SELECT Extension, COUNT(*) AS num FROM calls 
    WHERE Status = 'answered') answered ON c.Extension = answered.Extension
    GROUP BY Extension, answered.num
谢谢

您可以使用windows函数来实现这一点。应该很好用

您可以使用windows函数来实现这一点。应该很好用

您可以使用windows函数来实现这一点。应该很好用


您可以使用windows函数来实现这一点。应该可以正常工作。

通过使用
计数
聚合函数中的
case
语句来计算总接听电话数,您可以使用
分组方式使查询非常简单

select extension,
       count(*) as total,
       count(case when status = 'answered' then 'X' end) as totalAnswered
  from calls
 group by extension
我假设您正在尝试返回每个扩展的总数

编辑

我必须承认,你目前的帖子并不是100%清楚你的意图。您发布的查询意味着您希望计数为每个扩展。如果是这样,那么上面的查询将非常有效

但是在你的帖子里你说:

呼叫总数(计入整个表)

。。。这似乎暗示了一些不同的东西:您不希望每个扩展的计数都相同

为了完整性起见,如果希望计数对整个表是全局的,而不是每个扩展,可以使用以下查询:

而且,如果出于某种原因,您需要这两种计数的组合,那么您可以使用如下内容:

  select extension,
         count(*) as totalPerExtension,
         count(case when status = 'answered' then 'X' end) as totalAnsweredPerExtension,
         totalGlobal,
         totalAnsweredGlobal
    from (select *,
                 count(*) over () as totalGlobal,
                 count(case when status = 'answered' then 'X' end) over () as totalAnsweredGlobal
            from calls) c
   group by extension, totalGlobal, totalAnsweredGlobal

通过使用
count
聚合函数中的
case
语句,您可以使用
groupby
使查询非常简单

select extension,
       count(*) as total,
       count(case when status = 'answered' then 'X' end) as totalAnswered
  from calls
 group by extension
我假设您正在尝试返回每个扩展的总数

编辑

我必须承认,你目前的帖子并不是100%清楚你的意图。您发布的查询意味着您希望计数为每个扩展。如果是这样,那么上面的查询将非常有效

但是在你的帖子里你说:

呼叫总数(计入整个表)

。。。这似乎暗示了一些不同的东西:您不希望每个扩展的计数都相同

为了完整性起见,如果希望计数对整个表是全局的,而不是每个扩展,可以使用以下查询:

而且,如果出于某种原因,您需要这两种计数的组合,那么您可以使用如下内容:

  select extension,
         count(*) as totalPerExtension,
         count(case when status = 'answered' then 'X' end) as totalAnsweredPerExtension,
         totalGlobal,
         totalAnsweredGlobal
    from (select *,
                 count(*) over () as totalGlobal,
                 count(case when status = 'answered' then 'X' end) over () as totalAnsweredGlobal
            from calls) c
   group by extension, totalGlobal, totalAnsweredGlobal

通过使用
count
聚合函数中的
case
语句,您可以使用
groupby
使查询非常简单

select extension,
       count(*) as total,
       count(case when status = 'answered' then 'X' end) as totalAnswered
  from calls
 group by extension
我假设您正在尝试返回每个扩展的总数

编辑

我必须承认,你目前的帖子并不是100%清楚你的意图。您发布的查询意味着您希望计数为每个扩展。如果是这样,那么上面的查询将非常有效

但是在你的帖子里你说:

呼叫总数(计入整个表)

。。。这似乎暗示了一些不同的东西:您不希望每个扩展的计数都相同

为了完整性起见,如果希望计数对整个表是全局的,而不是每个扩展,可以使用以下查询:

而且,如果出于某种原因,您需要这两种计数的组合,那么您可以使用如下内容:

  select extension,
         count(*) as totalPerExtension,
         count(case when status = 'answered' then 'X' end) as totalAnsweredPerExtension,
         totalGlobal,
         totalAnsweredGlobal
    from (select *,
                 count(*) over () as totalGlobal,
                 count(case when status = 'answered' then 'X' end) over () as totalAnsweredGlobal
            from calls) c
   group by extension, totalGlobal, totalAnsweredGlobal

通过使用
count
聚合函数中的
case
语句,您可以使用
groupby
使查询非常简单

select extension,
       count(*) as total,
       count(case when status = 'answered' then 'X' end) as totalAnswered
  from calls
 group by extension
我假设您正在尝试返回每个扩展的总数

编辑

我必须承认,你目前的帖子并不是100%清楚你的意图。您发布的查询意味着您希望计数为每个扩展。如果是这样,那么上面的查询将非常有效

但是在你的帖子里你说:

呼叫总数(计入整个表)

。。。这似乎暗示了一些不同的东西:您不希望每个扩展的计数都相同

为了完整性起见,如果希望计数对整个表是全局的,而不是每个扩展,可以使用以下查询:

而且,如果出于某种原因,您需要这两种计数的组合,那么您可以使用如下内容:

  select extension,
         count(*) as totalPerExtension,
         count(case when status = 'answered' then 'X' end) as totalAnsweredPerExtension,
         totalGlobal,
         totalAnsweredGlobal
    from (select *,
                 count(*) over () as totalGlobal,
                 count(case when status = 'answered' then 'X' end) over () as totalAnsweredGlobal
            from calls) c
   group by extension, totalGlobal, totalAnsweredGlobal

我相信总数也需要包括未回答的项目。也许你是对的。如果是这样的话,你的答案是正确的。我相信总数也需要包括未回答的项目。也许你是对的。如果是这样的话,你的答案是正确的。我相信总数也需要包括未回答的项目。也许你是对的。如果是这样的话,你的答案是正确的。我相信总数也需要包括未回答的项目。也许你是对的。如果是这样的话,你的答案是正确的。几个细节:1)你发布的查询无效。考虑修理它。2) 您的查询似乎暗示您希望计数为每个扩展,但在文本中,您似乎希望计数基于整个表。是哪一个?几个细节:1)你发布的查询无效。考虑修理它。2) 您的查询似乎暗示您希望计数为每个扩展,但在文本中,您似乎希望计数基于整个表。是哪一个?几个细节:1)你发布的查询无效。考虑修理它。2) 您的查询似乎暗示您希望计数为每个扩展,但在文本中,您似乎希望计数基于整个表。是哪一个?一对