2014-11-28 3 views
0

Моя голова поворачивается к кашице, пытаясь получить это гнездо вокруг моей головы.Groupwise-max on count() с вложенными подзапросами

Поэтому в основном я получил 2 таблицы:

брокеров, который является моим "пользователь" таблица:

╔══════════╦════════════╦ 
║ ID  ║ EMAIL  ║ 
╠══════════╬════════════╬ 
║  1 ║ [email protected] ║ 
║  2 ║ [email protected] ║ 
║  3 ║ [email protected] ║ 
╚══════════╩════════════╝ 

Дома, который дома, которые добавили пользователи. В настоящее время пользователь и дом подключен колонкой электронной почты (я знаю, имеет больше смысла делать с ID):

╔══════════╦════════════╦════════════╦ 
║ ID  ║ TYPE  ║ EMAIL  ║ 
╠══════════╬════════════╬════════════╬ 
║  1 ║ 1   ║ [email protected] ║ 
║  2 ║ 3   ║ [email protected] ║ 
║  3 ║ 2   ║ [email protected] ║ 
║  4 ║ 3   ║ [email protected] ║ 
║  5 ║ 3   ║ [email protected] ║ 
║  6 ║ 2   ║ [email protected] ║ 
║  7 ║ 3   ║ [email protected] ║ 
║  8 ║ 1   ║ [email protected] ║ 
║  9 ║ 1   ║ [email protected] ║ 
║  10 ║ 2   ║ [email protected] ║ 
║  11 ║ 2   ║ [email protected] ║ 
║  12 ║ 3   ║ [email protected] ║ 
║  13 ║ 3   ║ [email protected] ║ 
║  14 ║ 2   ║ [email protected] ║ 
║  15 ║ 3   ║ [email protected] ║ 
║  16 ║ 1   ║ [email protected] ║ 
║  17 ║ 3   ║ [email protected] ║ 
║  18 ║ 2   ║ [email protected] ║ 
║  19 ║ 2   ║ [email protected] ║ 
║  20 ║ 3   ║ [email protected] ║ 
╚══════════╩════════════╩════════════╝ 

Теперь то, что я хочу сделать, это то, что я хочу, чтобы выбрать все брокеры, которые имеют тип 3 как самый высокий, самый популярный вид дома. Так, например, если дом типа 3 представляет «Апартаменты», я хочу найти брокеров, которые продают квартиры в качестве своего номера наиболее популярного типа.

Мой текущий запрос:

SELECT b.id, b.email, h.email, h.type, h.total 
FROM brokers b 
INNER JOIN (
SELECT COUNT(*) AS total, email, type 
FROM house 
GROUP BY email, type 
ORDER BY total DESC 
)h ON b.email = h.email 
AND h.type = "3" 
ORDER BY b.id DESC 

Теперь это выбирает только общее количество домов, что брокер имеет для типа 3. Это не только выбрать брокеров, где тип 3 является их самым популярным типом.

Теперь для этого мне нужно использовать так называемое «Groupwise Max». Но я не могу использовать макс() на COUNT (*), как:

MAX(COUNT(*)) as max_value 

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

Я пытаюсь исправить это на некоторое время, и я просто не могу обойти его. Кто-нибудь может помочь?

EDIT: Ожидаемый результат: Исходя из приведенной выше таблицы, Брокер [email protected] получил:

  • 1 Дом с типом 1.
  • 2 дома Тип 2.
  • 4 Дома с Type 3.

Брокер [email protected] получил:

  • 2 домов с 1 типом
  • 2 дома с Типом 2
  • 1 дом с Типом 3.

Брокер [email protected] получил:

  • 1 дом с 1 типом .
  • 3 дома с типом 2.
  • 4 дома с Типом 3.

Поскольку как [email protected], так и [email protected] чаще всего продают House Type 3, они должны быть включены в выход. [email protected] не продает тип 3 как наиболее популярный тип, поэтому он не должен быть включен в результат.

Так выход:

╔══════════╦════════════╦════════════╦ 
║ ID  ║ EMAIL  ║ Total  ║ 
╠══════════╬════════════╬════════════╬ 
║  1 ║ [email protected] ║ 4   ║ 
║  3 ║ [email protected] ║ 4   ║ 
╚══════════╩════════════╝════════════╝ 
+0

Можете ли вы поделиться образцовыми данными с ожидаемым выходом? – AK47

+0

Добавлены дополнительные данные выборки и ожидаемый результат и исследование. –

ответ

-1

Я не могу понять, почему вы должны Count()? Думаю, по вашему вопросу («выберите всех брокеров, которые имеют тип 3»), это не имеет смысла, или я чего-то не понимаю?

EDIT: Я сделал это в SQL SERVER по временной таблице и переменной Если вы можете преобразовать его в тузд синтаксиса, ваша проблема будет мы решили:

SELECT COUNT(*) as total, Email, [Type] 
into #tbl3 
from house 
group by Email, Type 

declare @a int 
set @a = (select MAX(total) from #tbl3) 

SELECT b.id, b.email, h.email, h.type, h.total 
FROM brokers b 
inner join 
(
select * from #tbl3 
where [email protected] 
) h 
on h.Email=b.Email and h.Type=3 

EDIT: Это MySql, который будет выполнять вашу работу.

CREATE TEMPORARY TABLE IF NOT EXISTS table2 AS (
SELECT COUNT(*) as total, Email, Type 
from house 
group by Email, Type 
); 

set @a = (select MAX(total) from table2); 

SELECT b.id, b.email, h.email, h.type, h.total 
FROM brokers b 
inner join 
(
select * from table2 
where [email protected] 
) h 
on h.Email=b.Email and h.Type=3 
+0

Мне нужно запереть дома и сгруппировать их по типу, чтобы узнать, какой тип дома наиболее популярен для этого брокера. Если я не посчитаю их, я не могу знать, что является «наиболее распространенным типом» для этого брокера. –

+0

Я добавил вспомогательный код. –

+0

@ Маркус Линд, разве мой ответ вам не помог? это раздражает увидеть рабочий пример с нисходящим потоком –

-1

Ответ на сообщение без выполнения, надеюсь, что это сработает!

Select a.ID,a.Email,b.Cnt from Brokers as a 
inner join (
      Select Email,count(ID) as Cnt from Houses where Type = 
        (Select max(Type) from Houses) 
      group by Email 
      ) as b on a.Email = b.Email 
+0

Это не проверяет, является ли тип 3 «самым популярным» или «максимальным значением» типов домов, которые добавил брокер. Это вернет всех брокеров независимо от того, является ли тип 3 наименее распространенным типом дома или наиболее распространенным. –

+0

Теперь вы можете проверить! – AK47

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