группировка по запросу - PullRequest
       11

группировка по запросу

1 голос
/ 09 января 2009

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

customer
--------
customer_id int
name        varchar(255)

order
-----
order_id    int
customer_id int
discount    boolean

Я могу получить количество заказов, сделанных каждым клиентом с помощью запроса:

select c.id, count(o.order_id)
from customer c 
left join order as o using c.customer_id = o.customer_id
group by 1

Кроме того, я могу получить количество заказов со скидкой, сделанных каждым клиентом:

select c.id, count(o.order_id)
from customer c 
left join order as o using c.customer_id = o.customer_id and o.discount = true
group by 1

Но я не могу найти способ получить оба в одном запросе. Я пробовал следующее:

select c.id, count(o.order_id), count(o2.order_id)
from customer c 
left join order as o using c.customer_id = o.customer_id
left join order as o2 using c.customer_id = o2.customer_id and o2.discount = true
group by 1

Но это не сработало. Можно ли рассчитать оба в одном (MySql) запросе?

Ура, Дон

Ответы [ 3 ]

3 голосов
/ 09 января 2009

Как насчет чего-то вроде

select c.id, count(o.order_id),sum(if(o.discount,1,0))
from customer c 
left join order as o using c.customer_id = o.customer_id
group by c.id
1 голос
/ 09 января 2009

Другие ответы близки, но вот как я бы написал:

SELECT c.id, COUNT(o.order_id) AS order_count, 
  SUM(o.discount = true) AS discount_order_count
FROM customer c 
  LEFT OUTER JOIN order AS o USING (customer_id)
GROUP BY c.id;

Обратите внимание, что использование USING требует скобок, и он принимает только список столбцов, которые будут сравниваться с =. Вы не можете дать полное выражение сравнения с синтаксисом USING, как вы можете с синтаксисом ON.

Также вы можете упростить выражение внутри SUM(), потому что сравнение на равенство возвращает либо 1, либо 0.

См. Также « Запрос: подсчет нескольких агрегатов на элемент »

1 голос
/ 09 января 2009

Вы могли бы сделать что-то вроде

select 
 c.id,
 sum(case o.discount when true then 1 else 0 end) as 'total discounted',
 count(o.order_id) as 'total orders'
from customer as c
 left join order as o using c.customer_id = o.customer_id 
group by c.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...