[英]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.