繁体   English   中英

SQL编程帮助…使用count和max ..etc

[英]SQL programming help… using count and max ..etc

我有一系列表格:

  • TECH PERSONNEL (pplSoft, fname, lname, pittID, expertise, office phone) ,其中fname是名字,lname是姓氏。

  • USERS (pplSoft, fname, lname, pittID, office phone)

  • CATEGORIES (category id, category, description) ,其中此表列出了提交的票证的所有可能类别。

  • INVENTORY(machine name, IP, network port, MACADDR, location id)

  • LOCATIONS(location id, location, building, notes)

  • TICKETS (ticket number, owner pplSoft, date submitted, date closed, days worked on, category id, machine name, location, description)

  • ASSIGNMENT (ticket number, tech pplSoft, date assigned, status) ,其中保留的状态是枚举,可以是:分配,进行中,委派,成功关闭或不成功关闭。

我的任务是列出“设备名称”,列出2011年12月和2012年1月两个月中出现问题最多的计算机的所有名称。

我必须将其转换为SQL。

我可以做这样的事情吗?

select machine_name 
from tickets 
where date_submitted >= '01-DEC-2012' and 'date_submitted <= '31-JAN-2012'  

但是我需要算票数或使用最大票数吗?

我如何从这里取得进展?

与任何复杂的SQL查询一样,秘密在于将其分解为多个部分,最好是可独立测试的部分。

第一个问题是确定在所述期间内每台机器拥有的票数。 这里的标准是什么? 如果一台机器的问题从2011年11月开始并一直持续到2011年12月,则应该计算在内; 同样,如果问题在2012年1月开始但在2012年2月完成,则应计算在内。 因此,我们需要:

SELECT machine_name, COUNT(*) AS num_tickets
  FROM tickets
 WHERE date_completed >= '01-Dec-2011' AND date_submitted <= '31-Jan-2012'
 GROUP BY machine_name;

如果您决定仅是票证提交的日期,请调整标准两次以引用date_submitted 同样,如果仅凭票完成的日期进行计数,则引用date_completed两次。 请注意,如果一台计算机的票证是从11月开始的,直到2月才解决,则上面的查询将对其进行计数; 如果您使用这两种选择中的任一种,则该机器在所讨论的时间内都没有问题。

这告诉我们在该时间段内为机器打开了几张票。 现在我们需要找出最大数量的门票:

SELECT MAX(num_tickets) AS max_tickets
  FROM (SELECT machine_name, COUNT(*) AS num_tickets
          FROM tickets
         WHERE date_completed >= '01-Dec-2011' AND date_submitted <= '31-Jan-2012'
         GROUP BY machine_name
       );

现在,我们需要选择具有此票证数量的计算机名称:

SELECT machine_name
  FROM (SELECT MAX(num_tickets) AS max_tickets
          FROM (SELECT machine_name, COUNT(*) AS num_tickets
                  FROM tickets
                 WHERE date_completed >= '01-Dec-2011' AND date_submitted <= '31-Jan-2012'
                 GROUP BY machine_name
               )
        ) AS n
  JOIN (SELECT machine_name, COUNT(*) AS num_tickets
          FROM tickets
         WHERE date_completed >= '01-Dec-2011' AND date_submitted <= '31-Jan-2012'
         GROUP BY machine_name
       ) AS m
    ON n.max_tickets = m.num_tickets;

假设Oracle支持WITH子句,则可以简化(相当大):

WITH t AS
    (SELECT machine_name, COUNT(*) AS num_tickets
       FROM tickets
      WHERE date_completed >= '01-Dec-2011' AND date_submitted <= '31-Jan-2012'
      GROUP BY machine_name
    )
SELECT t.machine_name
  FROM t
  JOIN (SELECT MAX(num_tickets) AS max_tickets FROM t) AS m
    ON t.num_tickets = m.max_tickets;

警告 :如SQL标准所支持,我在子查询上使用了“ AS别名”。 我相信Oracle不允许使用“ AS别名”,而在表名后只需要“别名”即可。 我不确定这是否也适用于子查询的名称。 如果“ AS m”和“ AS n”符号引起麻烦,请尝试删除AS。 您可能会发现列重命名为“ AS num_tickets”等类似的问题,但是我相信Oracle在这种情况下确实允许使用AS。

大概这只是一系列问题之一,因为答案似乎不需要票证表以外的任何表。 大概其他问题需要使用其他表。

您需要使用group by

select machine_name, count(*) as numMachines
from tickets
where date_submitted >= '01-DEC-2011' and 'date_submitted <= '31-JAN-2012'
group by machine_name
order by numMachines desc
select machine_name, count(machine_name) as totalTicketCount
from tickets 
where date_submitted >= '01-DEC-2012' and 'date_submitted <= '31-JAN-2012' 
Group By machine_name
Order by totalTicketCount DESC 

您的查询将针对每个问题返回一行。 第一步是将结果按计算机分组,以便每台计算机获得一行。 然后,您可以添加一个计数列,以显示该计算机有多少问题。

要查找最大数量的问题,您需要将查询放入子选择中,以便提取最大数量的问题。 然后,您可以将其用作Have子句中的子选择,以返回具有该最大计数的计算机。

SELECT machine_name, COUNT(machine_name) AS ticket_count
  FROM tickets
  WHERE date_submitted >= '01-DEC-2012' AND date_submitted <= '31-JAN-2012'
  GROUP BY machine_name
  HAVING ticket_count = (
    SELECT MAX(ticket_count) FROM (
      SELECT COUNT(machine_name) AS ticket_count
        FROM tickets
        WHERE date_submitted >= '01-DEC-2012' AND date_submitted <= '31-JAN-2012'
        GROUP BY machine_name
    )
  )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM