Справка по программированию SQL .... используя count и max ..etc - PullRequest
0 голосов
/ 13 февраля 2012

У меня есть серия таблиц:

  • 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 года и января 2012 года.

Я должен превратить это в SQL.

Могу ли я сделать что-то подобное?

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

Но мне нужно пересчитать билеты или использовать макс?

Как мне добиться прогресса?

Ответы [ 4 ]

3 голосов
/ 13 февраля 2012

Как и в случае любого сложного запроса SQL, секрет состоит в том, чтобы разбить его на части, предпочтительно независимо проверяемые части.

Первая проблема состоит в том, чтобы установить количество билетов, которое было у каждой машины за рассматриваемый период. Какой критерий здесь? Вероятно, если у машины возникла проблема, которая началась в ноябре 2011 года и продлилась до декабря 2011 года, это следует учитывать; аналогично, если проблема была начата в январе 2012 года, но была решена в феврале 2012 года, это следует учитывать. Итак, нам нужно:

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. Обратите внимание, что если у машины был тикет, который был запущен в ноябре и не был решен до февраля, запрос выше будет его учитывать; если вы используете одну из альтернатив, то у этой машины не было проблем в течение рассматриваемого периода.

Это говорит нам, сколько билетов было открыто для машины за период времени. Теперь нам нужно определить, какое количество билетов является максимальным:

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;

Предупреждение : Я использовал псевдоним AS в подзапросах, как это поддерживается стандартом SQL. Я считаю, что Oracle не допускает «псевдоним AS» и требует только «псевдоним» после имен таблиц; Я не уверен, относится ли это также к именам для подзапросов. Если нотации «AS m» и «AS n» вызывают проблемы, попробуйте сбросить AS. Вы можете найти аналогичную проблему с переименованием столбца «AS num_tickets» и т. Д., Но я считаю, что Oracle разрешает использование AS в этом контексте.

Предположительно, это только один из серии вопросов, поскольку для ответа, похоже, не требуется никаких таблиц, кроме таблицы Билеты. Предположительно, другие вопросы требуют использования других таблиц.

2 голосов
/ 13 февраля 2012

Вам нужно использовать 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
1 голос
/ 13 февраля 2012

Ваш запрос вернет вам одну строку для каждой проблемы.Ваш первый шаг - сгруппировать результаты по машинам, чтобы получить по одной строке для каждой машины.Затем вы можете добавить столбец подсчета, показывающий, сколько проблем было для этого компьютера.

Чтобы найти максимальное количество проблем, вам нужно поместить свой запрос в подвыбор, чтобы вы могли извлечь максимум.Затем вы можете использовать это как подвыбор в предложении, чтобы вернуть машины с таким максимальным количеством.

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
    )
  )
1 голос
/ 13 февраля 2012
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 
...