сравнить агрегаты с данными строк - PullRequest
1 голос
/ 01 декабря 2011

У меня есть таблица в MySql, связанная с покупкой инвентаря.

Формат таблицы следующий:

  • itemname (varchar)
  • vendor (varchar))
  • pdate (datetime)
  • Кол-во (десятичное)
  • норма (десятичное)
  • всего (десятичное)
  • id (mediumint)) (автоинкремент)
A report is to be generated that must have the following columns

Item     HighestRate     HighestRateDate        LowestRate      LowestRateDate    % difference

--
Item  is the itemname
HighestRate and HighestRateDate are rates at maximum
LowestRate and Date are rates at minimum
%difference is a basic difference percentage between highestrate and lowestrate of a row

Я подготовил следующий запрос

SELECT itemname,rate,pdate  from purchases 
group by itemname
having rate = max(rate)
order by itemname

, который генерирует половину отчета.

Однако, поскольку это требуети самый низкий и самый высокий показатель.Этот отчет неполон, и печать двух отчетов затрудняет сравнение.

Любая помощь будет принята.

Спасибо

Ответы [ 2 ]

2 голосов
/ 01 декабря 2011

Здесь идет.Это не красиво, но работает.

select min.itemname, 
       min.rate, 
       min.pdate, 
       max.rate, 
       max.pdate, 
       (max.rate - min.rate)/max.rate as diff 
  from (SELECT p.itemname, 
               p.rate,
               pdate 
          from purchases p, 
               (select itemname, 
                       max(rate) as rate 
                  from purchases 
                 group by itemname) max_values 
         where p.itemname = max_values.itemname 
           and p.rate = max_values.rate
       ) max, 
       (SELECT p.itemname, 
               p.rate,
               pdate 
          from purchases p, 
               (select itemname, 
                       min(rate) as rate 
                  from purchases 
                 group by itemname) min_values 
         where p.itemname = min_values.itemname 
           and p.rate = min_values.rate
       ) min 
  where max.itemname = min.itemname;
1 голос
/ 01 декабря 2011

Вам понадобится индекс на (itemname, rate), чтобы этот запрос не был слишком медленным.

Если есть две или более даты с одинаковым максимальным (или минимальным) показателем, будет выбрана (более или менее) случайная дата.Если вы хотите контролировать это, измените ORDER BY rate ASC (например, на ORDER BY rate ASC, pdate DESC):

SELECT 
    di.itemname  AS Item
  , maxr.rate    AS HighestRate
  , maxr.pdate   AS HighestRateDate
  , minr.rate    AS LowestRate
  , minr.pdate   AS LowestRateDate
  , (maxr.rate - minr.rate)/maxr.rate        --- calculations
                 AS PrecentDifference
FROM
    ( SELECT DISTINCT itemname
      FROM purchases 
    ) AS di
  JOIN
    purchases AS minr
      ON  minr.id =                          --- I guess this is the PK
          ( SELECT id
            FROM purchases p
            WHERE p.itemname = di.itemname 
            ORDER BY rate ASC
            LIMIT 1
          )
  JOIN 
    purchases AS maxr
      ON  maxr.id =                      
          ( SELECT id
            FROM purchases p
            WHERE p.itemname = di.itemname 
            ORDER BY rate DESC
            LIMIT 1
          )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...