Sql 查询同一个表两次,以在一次查询中获得不同的数字

Sql 查询同一个表两次,以在一次查询中获得不同的数字,sql,sql-server,Sql,Sql Server,使用Microsoft SQL Server,表1有客户请求,表2有一个解决代码,这样我们就可以看到客户为什么要写,以及我们为解决他们的问题做了什么。有时候销售代表忘记添加解决方案代码,所以我尝试运行一个查询,告诉我每个销售代表的姓名,有多少已解决问题缺少解决方案代码,他们总共解决了多少问题,以及他们已解决问题与未解决方案代码的已解决问题的百分比是多少。例如: Agent Name | Missing Resolution Codes | Total issues closed | % of

使用Microsoft SQL Server,表1有客户请求,表2有一个解决代码,这样我们就可以看到客户为什么要写,以及我们为解决他们的问题做了什么。有时候销售代表忘记添加解决方案代码,所以我尝试运行一个查询,告诉我每个销售代表的姓名,有多少已解决问题缺少解决方案代码,他们总共解决了多少问题,以及他们已解决问题与未解决方案代码的已解决问题的百分比是多少。例如:

Agent Name | Missing Resolution Codes | Total issues closed | % of 
----------------------------------------------------------------------
Mary       |             12           |         120         | 10.00%
Bob        |              8           |         704         |  1.14%
显示丢失的解析代码的查询非常有效。显示已关闭的总问题的查询非常有效。每当我尝试组合它们时,我要么得到:

Mary | 12 | 120
Mary | 12 | 704
Bob  |  8 | 120
Bob  |  8 | 704
联合

Mary |  12
Mary | 120
Bob  |   8
Bob  | 704
或者如果我尝试从选择。。。t1,选择。。。t2,我明白了:

Mary | 12 | 120
Mary | 12 | 704
Bob  |  8 | 120
Bob  |  8 | 704
如果我在最后添加一个groupby,我会得到各种各样的错误

这两个问题本身如下:

缺少解析代码:

select i.assigned_to, count(i.assigned_to)
from customer_issues as i
left join resolution_codes as r on i.issue_ID = r.issue_ID
where r.issue_id is null
and i.status='closed'
group by i.assigned_to
已结清的问题总数:

select assigned_to, count(assigned_to)
from customer_issues
where status='closed'
group by assigned_to
感谢您提供的任何帮助


编辑:只是澄清一下,解决方案代码位于不同的表中,因为一个客户问题可能包含多个问题和多个解决方案。因此,虽然customer_issues(客户问题)表确实有一个指标表明问题本身已经解决,但resolution_codes(解决问题代码)表显示了客户遇到的不同问题,哪些问题我们可以解决,哪些问题我们不能解决,等等。

因为两个查询之间的唯一区别似乎是左连接和空过滤器,所以您可以在一个查询中完成所有操作

select t1.assigned_to, t1.missing, t2.total from 
( 
select i.assigned_to as assigned_to, count(i.assigned_to) as missing
from customer_issues as i
left join resolution_codes as r on i.issue_ID = r.issue_ID
where r.issue_id is null
and i.status='closed'
group by i.assigned_to
) t1 INNER JOIN
(
select assigned_to, count(assigned_to) as total
from customer_issues
where status='closed'
group by assigned_to
) t2
ON t1.assigned_to=t2.assigned_to
我认为这应该行得通:

;with source as (
   select 
        i.assigned_to as [Agent Name], 
        count(r.issue_id) as [Resolution Codes], 
        count(i.assigned_to) as [Total issues closed]
    from customer_issues as i
    left join resolution_codes as r on i.issue_ID = r.issue_ID
    where i.status='closed'
    group by i.assigned_to
)

select 
    [Agent Name], 
    [Total issues closed]-[Resolution Codes] as [Missing Resolution Codes],
    [Total issues closed],
    ([Total issues closed]-[Resolution Codes])*100.0/[Total issues closed] as [% of]
from source;
更新

显然,在表customer_issues中的任何地方都没有反映出没有解决代码,只有在与给定问题对应的解决代码中没有任何行时才会反映出来。这似乎有点可疑,但从更大的角度来看,这可能是明智的。无论如何,您可以执行单个聚合查询,一次性收集所需的所有统计信息,然后根据结果计算所有衍生统计信息

将聚合查询作为内联视图执行是很有用的,这样可以更轻松、更不冗长地重用两个聚合列:

select
  agg.assigned_to,
  agg.total_closed,
  (agg.total_closed - agg.with_code) as without_code,
  ((agg.total_closed - agg.with_code) / cast(agg.total_closed as float)) as "% without"
FROM (
    select
      ci.assigned_to,
      count(*) as total_closed,
      count(rc.issue_id) as with_code
    from customer_issues ci
      left join resolution_codes rc on ci.issue_ID = rc.issue_ID
    where ci.status='closed'
    group by ci.assigned_to
  ) agg
  ;

您想要的输出是一个字段中的分辨率计数,而在另一个字段中关闭?可以选择t1.name,。。。。从选择。。。t1连接选择。。。t2 ON t1.name=t2.name使用您的第二种方法,并将t1和t2关联到指定的对象。这很有效,非常感谢!缺少的是where t1.assigned_to=t2.assigned_to。虽然这样做有效,但建议避免使用不推荐的语法创建带有逗号分隔的表列表的交叉连接,并且where子句中的约束在很长一段时间内不符合标准,但效果很好。更重要的是,整个过程可以在一个查询中完成,这将提高性能。我喜欢您的想法,但当我尝试该查询时,我得到的是一个已分配到的对象和已关闭的总对象的列表。不带_代码的和不带的%都是零。这些表是十多年前设置的,因此我假设在这种情况下我仍然需要使用联接?@SpiceWeasel,嗯。可能我对您的数据结构做出了错误的假设,正如我的断言所总结的那样,丢失的解析代码必须显示为customer_issues.issue_ID为NULL。相反,如果缺少解析代码仅在表解析_代码中没有行的情况下显示,则是,您确实需要联接。我已经更新了我的答案以假设这种情况。此外,我添加了一些括号并切换到限定名称,尽管我认为这两种名称都不是必需的。当我尝试此操作时,我得到了一个devide by zero错误。当我移除视觉部分时,我可以看到原因。代理名称NULL在缺少解决方案代码的情况下显示为-335,在关闭的问题总数中显示为0。将分配的_添加到is not null似乎也解决了这一问题。@SpiceWeasel很可能是我漏了一些东西,因为我对您的表有一些猜测,并且没有任何好的数据可供测试。我不明白为什么它会做零除法,但如果你说是的话,我相信你。你试过小提琴中的代码还是上面的代码?我改了一点。