2014-06-16 2 views
-1

У меня есть две таблицы, первый один держит рейтинг для клиентов: CustId и Point (Там может быть более одной точки для одного клиента) Второй хранит информацию о клиентах. Я хочу заказать первую десятку клиентов, поэтому я должен составить средний рейтинг для каждого клиента, а затем показать 10 лучших клиентов из второй таблицы. Я попытался использовать стыковку с таблицами, но не смог. Не могли бы вы посоветовать мне самый простой способ выполнить это действие?Inner объединить две таблицы заказать вторую таблицу

выборка данных: tb_rating:

Cust_Id Rating 
1  3 
1  5 
2  3 
1  3 
2  1 

tb_Customers:

Cust_Id Cust_Name 
1  aaaa 
2  bbbb 
+2

RDBMS? Пример данных? Ваш текущий запрос? – potashin

+0

@Notulysses Рабочий запрос отсутствует. Я попытался изменить [this] (http://stackoverflow.com/questions/1572831/avg-of-a-sum-in-one-query) к моему делу, но это не сработало. Образец данных прост: таблица рейтингов: рейтинг - CUST_ID 4 - 1 5 - 2 3 - 1 3 - 2 клиентов Таблица: CUST_ID CUST_NAME 1 - ааа 2 - BBBB – meeteine

+0

Обновите свой ответ, не публиковать такие вещи в комментариях. – potashin

ответ

0
select tb_customers.cust_id, tb_customers.cust_name, avg(rating) as average 
from tb_customers join tb_rating on tb_customers.cust_id = tb_rating.cust_id 
group by tb_customers.cust_id, tb_customers.cust_name 
order by average desc; 

Вы не сказали, какую СУБД вы используете, и как получить первые десять строк в результате, зависит от этого. Если это SQL Server, просто добавьте «топ-10» после «select». Если это MySQL, добавьте «limit 0, 10» в конце запроса. Для других систем могут потребоваться другие способы их выражения.

Еще одна деталь: если столбец «рейтинг» имеет тип integer, вы можете (в зависимости от того, какую систему вы используете) заменить «avg (rating)» на «avg (1.0 * rating)», если вы хотите получить десятичные знаки в ваших средних значениях.

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

select * 
from tb_customers join tb_rating on tb_customers.cust_id = tb_rating.cust_id; 

Попробуйте запустить его с вашими данными, так что вы видите, что результат можно было бы ожидать. Затем вычислите среднее значение для каждого клиента, используя «avg» и «group by»:

select tb_customers.cust_id, tb_customers.cust_name, avg(rating) as average 
from tb_customers join tb_rating on tb_customers.cust_id = tb_rating.cust_id 
group by tb_customers.cust_id, tb_customers.cust_name; 

Запустите это тоже. Затем добавьте «порядок», как показано выше, и, наконец, как получить первые десять строк.

+0

это SQL-сервер. что такое точка? вы имеете в виду tb_rating.Rating? это сработало, почти. Есть один момент: если я добавлю tb_customers.cust_name в запрос, он не будет работать. Я хочу показать имена как output not id. выберите tb_customers.cust_Name, tb_customers.cust_id, AVG (tb_rating.rating) как среднее FROM tb_customers JOIN tb_rating ON tb_customers.cust_id = tb_rating.cust_id GROUP BY tb_customers.cust_id ORDER BY average DESC Что не так в этом запросе? – meeteine

+0

@meeteine: Да, я имею в виду «рейтинг». Исправлено. (Но для моей защиты в первой строке ваших вопросов он говорит «point» not «rating».) И я добавил tb_customers.cust_name в запрос. –

+0

Я просто попросил очистить, и ты прав; мой вопрос не совсем ясен :) сейчас он совершенен. благодаря :) – meeteine

0

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

select a.cust_ID, a.Cust_Name, b.Rating 
from Customer a, 
    (
    select top 10 cust_ID, avg(Rating) as Point from rating 
    group by cust_ID order by avg(Rating) desc 
    ) b where a.cust_ID = b.cust_ID 
order by a.cust_name 
+0

это не сработало. все выглядит нормально, но он возвращает любую строку. – meeteine

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