Агрегатная функция не работает должным образом с подзапросом - PullRequest
1 голос
/ 20 декабря 2011

Повеселимся с MySQL, задавая сложные вопросы.

По сути, у меня есть таблица, полная транзакций, и из этого я хочу определить из всех доступных продуктов (productid), кто (userid) купил большую часть каждого?Тип в предложении where относится к типу транзакции, где 1 - покупка.

У меня есть подзапрос, который сам по себе возвращает список суммированных продуктов, купленных для каждого человека, и он сам по себе работает хорошо.Из этого я пытаюсь выбрать максимум суммированных количеств и сгруппировать по продуктам, что является довольно простым агрегатом.К сожалению, это дает мне забавные результаты!userid не соответствует правильно заявленным максимальным productid продажам.

select 
    `userid`, `productid`, max(`sumqty`)
from
    (select 
        `userid`, `productid`, sum(`qty`) as `sumqty`
    from
        `txarchive`
    where
        `type` = 1
    group by `userid`,`productid`) as `t1`
group by `productid`

Я удалил все внутренние объединения, чтобы дать больше словесных результатов, поскольку они не меняют логику всего этого.

Вот структура tx, если вы заинтересованы.

id          bigint(20)    #transaction id
UserID      bigint(20)    #user id, links to another table.
ProductID   bigint(20)    #product id, links to another table.
DTG         datetime      #date and time of transaction
Price       decimal(19,4) #price per unit for this transaction
QTY         int(11)       #QTY of products for this transaction
Type        int(11)       #transaction type, from purchase to payment etc.
info        bigint(20)    #information string id, links to another table.

* edit Рабочий окончательный запрос: (его biggish)

select 
    `username`, `productname`, max(`sumqty`)
from
    (select 
        concat(`users`.`firstname`, ' ', `users`.`lastname`) as `username`,
            `products`.`name` as `productname`,
            sum(`txarchive`.`qty`) as `sumqty`
    from
        `txarchive`
    inner join `users` ON `txarchive`.`userid` = `users`.`id`
    inner join `products` ON `txarchive`.`productid` = `products`.`id`
    where
        `type` = 1
    group by `productname`,`username`
    order by `productname`,`sumqty` DESC) as `t1`
group by `productname`
order by `sumqty` desc

1 Ответ

1 голос
/ 20 декабря 2011

Не лучшее решение (даже не гарантируется, что оно будет работать 100% времени):

select 
    `userid`, `productid`, max(`sumqty`)
from
    ( select 
          `userid`, `productid`, sum(`qty`) as `sumqty`
      from
          `txarchive`
      where
          `type` = 1
      group by 
          `productid`  
        , `userid`
      order by 
          `productid`
        , `sumqty` DESC          
    ) as `t1`
group by
    `productid`
...