簡體   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