2016-07-05 2 views
0

У меня есть таблица с 67 столбцами и около 36 000 строк, мне нужно запустить SELECT на основе двух из этих столбцов.Выберите данные в одной таблице с 1: Многие отношения

Важными столбцами являются FINANCIAL_ACCOUNT_ID, EVENT_DESCRIPTION.

FINANCIAL_ACCOUNT_ID - уникальный номер для каждой учетной записи, но не может быть уникальным в таблице. Описание события не уникально. Описание события может содержать «Событие 1» «Событие 2» «Событие 3» и т. Д.

Так таблица может выглядеть следующим образом:

TABLE 
+----------------------+-------------------+-------------+ 
| FINANCIAL_ACCOUNT_ID | EVENT_DESCRIPTION | OTHER_STUFF | 
+----------------------+-------------------+-------------+ 
| 1121    | Event 1   |  n/a  | 
| 107401    | Event 2   |  n/a  | 
| 256483    | Event 1   |  n/a  | 
| 1121    | Event 3   |  n/a  | 
| 107401    | Event 1   |  n/a  | 
| 363586    | Event 1   |  n/a  | 
| 546875    | Event 1   |  n/a  | 
| 546875    | Event 2   |  n/a  | 
+----------------------+-------------------+-------------+ 


RESULT 
+----------------------+-------------------+-------------+ 
| FINANCIAL_ACCOUNT_ID | EVENT_DESCRIPTION | OTHER_STUFF | 
+----------------------+-------------------+-------------+ 
| 107401    | Event 2   |  n/a  | 
| 107401    | Event 1   |  n/a  | 
| 546875    | Event 1   |  n/a  | 
| 546875    | Event 2   |  n/a  | 
+----------------------+-------------------+-------------+ 

Что мне нужно, чтобы получить Возвращается вся строка, если есть счет финансовых ID с ОБА «Событием 1» и «Event 2».

Я попытался с оговорками в сочетании с внутренними объединениями ... В своей последней попытке, я добавил COUNT (financial_account_id), такие как:

select FINANCIAL_ACCOUNT_ID, EVENT_DESCRIPTION, COUNT(FINANCIAL_ACCOUNT_ID) 
FROM master 
group by FINANCIAL_ACCOUNT_ID 
HAVING COUNT(FINANCIAL_ACCOUNT_ID) >1; 

Однако вот результаты я в видя, с этого выберите заявление: (. Я говорю, что нужно всю строку, но как только я получаю правильные результаты вернулся, я могу отфильтровать лишние столбцы мне не нужны)

Financial_Account_ID | Event_Description | COUNT(Financial_Account_ID) 
     107401   |  Event 2  |   2 
     546875   |  Event 1  |   2  

Любойпомощь в том, как должен выглядеть SQL-запрос вроде этого? Деталь: MariaDB 10, имя_базы_данное: JuneEvents, имя таблицы: мастер Я также получила копию в MS-SQL 2012 Express, дб

EDIT: - Простите @ Тим за что, мне нужно, чтобы соответствовать каждой учетной записи для как событие «1», так и событие «событие 2» 3 и любые другие, которые могут существовать. Проясняет?

РЕШЕНИЕ: Я использовал второй запрос @ Gordon с JOIN в качестве точки спрыгивания и получил окончательный запрос, который выглядел следующим образом: (обратите внимание: теперь есть дополнительные поля, но я добавил их после начального запрос возвратил результаты Проппер из начального набора данных.)

SELECT t.financial_account_id, t.event_description, t.sold_quantity, t.paid_amount 
FROM master t JOIN 
    (SELECT financial_account_id 
     FROM master t 
     WHERE event_description IN ('Event 1', 'Event 2') 
     GROUP BY financial_account_id 
     HAVING COUNT(DISTINCT event_description) = 2 
    ) tt 
    ON tt.financial_account_id = t.financial_account_id 
    WHERE (event_description IN ('Event 1', 'Event 2') AND (sold_quantity > 0)); 
+0

Вы никогда не давал нам логику для определения _which_ ' Event_Description' для возврата в конечном результате. –

+0

«GROUP BY» очень мощный, но так используется столбец datetime, чтобы помочь вам отличить результаты. В зависимости от того, как Event_1 и Event_2 разделены (могут ли они произойти одновременно? Возможны ли значения NULL?), Возможно, вам придется использовать подзапрос. Очевидно, нам нужна более подробная информация о бизнес-логике и правилах. –

+0

@RCMaples, так вы говорите, что хотите совместить учетную запись с событиями 1 и 2, а также только события 1 и 2? –

ответ

0

Чтобы получить счета с обоих событий, используйте:

SELECT financial_account_id 
FROM master t 
WHERE event_description IN ('Event 1', 'Event 2') 
GROUP BY financial_account_id 
HAVING COUNT(DISTINCT event_description) = 2; 

Затем, чтобы получить исходные строки, используйте JOIN:

SELECT t.* 
FROM master t JOIN 
    (SELECT financial_account_id 
     FROM master t 
     WHERE event_description IN ('Event 1', 'Event 2') 
     GROUP BY financial_account_id 
     HAVING COUNT(DISTINCT event_description) = 2 
    ) tt 
    ON tt.financial_account_id = t.financial_account_id; 
+0

я использовал свой 2-й запрос с JOIN и в конечном итоге с окончательным запросом, который выглядит следующим образом: ВЫБРАТЬ t.financial_account_id, t.event_description, t.sold_quantity, t.paid_amount от ведущего т РЕГИСТРИРУЙТЕСЬ (SELECT financial_account_id FROM мастер-т ГДЕ event_description IN ('Событие 1', 'Событие 2') GROUP BY financial_account_id HAVING COUNT (DISTINCT event_description) = 2 ) TT ON tt.financial_account_id = t.financial_account_id где (event_description IN ('Event 1 ',' Event 2 ') AND (sold_quantity> 0)); –

0

Следующий запрос будет давать все FINANCIAL_ACCOUNT_ID, которые имеют как 'Event 1' и 'Event 2' и только эти два события. Если вы хотите получить другую информацию, вы можете легко присоединить этот результат к другой таблице.

SELECT FINANCIAL_ACCOUNT_ID, 
    SUM(CASE WHEN EVENT_DESCRIPTION IN ('Event 1', 'Event 2') THEN 1 ELSE 0 END) AS eventCount 
FROM yourTable 
GROUP BY FINANCIAL_ACCOUNT_ID 
HAVING eventCount = 2 AND COUNT(*) = 2 
Смежные вопросы