2015-08-10 3 views
1

Мне нужна помощь в получении определенного результата из sql.
пользователей таблица:SQL подсчет количества людей по количеству которых

userid | name 
-------|----------- 
1  | Bob Robert 
2  | Steve Smith 
3  | Willard Henegar 
4  | Max Rockwell 
5  | Marion Paley 
6  | Marcus Delisle 

заказы стол:

orderid | userid 
--------|------- 
1  |1 
2  |1 
3  |1 
4  |2 
5  |3 
6  |2 
7  |4 
8  |4 
9  |5 
10  |4 
11  |4 
12  |1 

хотел результат

numOrders | numPeople 
----------|---------- 
0   |1 
1   |2 
2   |1 
3   |0 
4   |2 

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

Я пытался понять это и придумал это:

SELECT 
Count(orders.orderid) AS numOrders, 
Count(users.userid) AS numPeople 
FROM users 
     LEFT JOIN orders 
       ON users.userid = orders.userid 
GROUP BY numOrders 

, но это дает свою ошибку, что я не могу группа по numOrders.

Любые предложения о том, как я могу это достичь?

ответ

1

Если вы хотите, чтобы пользователи без каких-либо заказов, вы можете сделать следующее:

select NumOrders, count(*) as NumPeople 
from (
    select u.UserId, count(*) as NumOrders 
    from users u 
    left join orders o on o.UserId = o.UserId 
group by o.UserId 
) t 
group by t.NumOrders 

Вы также можете сделать:

select NumOrders, count(*) as NumPeople 
from (
    select 
    u.UserId, 
    (select count(*) from orders o where o.UserId = u.UserId) as NumOrders 
from users u 
) t 
group by t.NumOrders 

Как уже упоминалось Гордон, имея номер таблицы не поможет. Если вы знаете, что никто не будет больше, чем, скажем, 1000 заказов, и вы хотите показать одну строку для каждого числа 0 - 1000, вы могли бы сделать что-то вроде этого:

select number as NumPeople, isnull(p.NumOrders, 0) as NumOrders 
from master..spt_values v 
left join 
(
    select t.NumOrders, count(*) as NumPeople 
    from (select 
      u.UserId, 
      (select count(*) from order o where o.UserId = u.UserId) as NumOrders 
    from users u) t 
    group by NumOrders 
) p on p.NumOrders = v.number 
where type = 'P' 
and number <= 1000 

выше будет работать для SQL Server. Я не уверен, что MySQL имеет таблицу основных значений, но в противном случае вы можете легко создать таблицу чисел и заменить ее.

1
select count(userid), numorders 
from(
SELECT 
Count(*) AS numOrders, 
userid 
from orders 
group by userid) t 
group by numorders 

Orders таблица будет достаточно, как вам просто нужно количество заказов и пользователей.

2

Вам нужна двойная гистограмма. Это самый простой способ:

select cnt, count(*), min(userid), max(userid) 
from (select u.userid, count(o.userid) as cnt 
     from users u left join 
      orders o 
      on u.userid = o.userid 
     group by u.userid 
    ) u 
group by cnt; 

Это, однако, не даст вам строку со счетом 0. Для этого требуется немного больше усилий. Это помогает, если у вас есть таблица numbers, чтобы заполнить недостающие значения.

Смежные вопросы