2016-05-06 2 views
0

У меня есть 2 таблицы (люди, данные). В таблице данных мне нужно искать 1 поле для разных результатов.SQL найти разные данные из 1 поля в 1 таблице и соединить 2 таблицы

  1. Основная группа (из таблицы данных (мы будем называть эту группу a)) будут людьми, у которых есть код C10 *, найденный из поля кода.
  2. Затем мне нужно посмотреть, сколько из них (имеющих C10 *) также имеют 9Nu0 ИЛИ 9Nu1
  3. Эти данные также находятся в поле кода в той же таблице данных (поэтому мы будем называть эту группу b), но в другом ряду. Если они имеют 9Nu0 OR 9Nu1, верните только последний. Некоторые могут также иметь значение null.
  4. Связь между людьми и таблицами данных является ENTITY_ID = master_id
  5. Наконец показать DOB из таблицы людей для получения конечной таблицы или результатов, показывая master_id, p.dob, a.eventdate, a.read_code, b.eventdate, b.read_code (как показано ниже).

Примечание: Я использую Excel VBA, но писать этот код в SQL, как я извлечение данных из базы данных PostgreSQL с помощью OLEDB

Вот раскладка людей таблицы:

entity_id | dob 
1   | 23/09/1951 
3   | 08/11/1950 
30   | 17/08/1959 
61   | 03/06/1957 
69   | 08/03/1941 
72   | 03/03/1973 
105   | 28/11/1925 
108   | 08/10/1934 
153   | 06/08/1939 
168   | 11/03/1953 

Здесь является расположение таблицы данных

master_id | eventdate | code 
1   | 11/11/2011 | 9Nu1.00 
1   | 09/03/2016 | C10E700 
3   | 16/11/1999 | 9Nu0.00 
3   | 01/01/2008 | C10..00 
30   | 27/11/2009 | C10F.00 
61   | 18/02/2008 | 9Nu0.00 
61   | 19/12/1997 | C10..00 
69   | 01/05/1996 | 9Nu1.00 
69   | 21/10/2004 | C10F.00 
69   | 01/05/1995 | 9Nu0.00 
72   | 09/03/2016 | 9Nu0.00 
72   | 11/11/2011 | C10F.00 
105   | 16/11/1999 | C10..00 
108   | 18/10/2005 | C10F.00 
153   | 19/12/1997 | 9Nu1.00 
153   | 18/02/2008 | C10F.00 
168   | 21/10/2004 | 9Nu0.00 
168   | 01/05/1995 | C10F.00 

и мне нужен результат, чтобы выглядеть следующим образом:

master_id | dob   | a.eventdate | a.code | b.eventdate | b.code 
1   | 23/09/1951 | 09/03/2016 | C10E700 | 11/11/2011 | 9Nu1.00 
3   | 08/11/1950 | 01/01/2008 | C10..00 | 16/11/1999 | 9Nu0.00 
30   | 17/08/1959 | 27/11/2009 | C10F.00 | 18/10/2005 | 
61   | 03/06/1957 | 19/12/1997 | C10..00 | 18/02/2008 | 9Nu0.00 
69   | 08/03/1941 | 21/10/2004 | C10F.00 | 01/05/1995 | 9Nu1.00 
72   | 03/03/1973 | 11/11/2011 | C10F.00 | 09/03/2016 | 9Nu0.00 
105   | 28/11/1925 | 16/11/1999 | C10..00 | 01/01/2008 | 
108   | 08/10/1934 | 18/10/2005 | C10F.00 | 27/11/2009 | 
153   | 06/08/1939 | 18/02/2008 | C10F.00 | 19/12/1997 | 9Nu1.00 
168   | 11/03/1953 | 01/05/1995 | C10F.00 | 21/10/2004 | 9Nu0.00 

Вот мой провал код

Sub GetData() 

Const sqlconnection = "Provider=oledb;" 

Dim conn As New Connection 
conn.ConnectionString = sqlconnection 
conn.Open 
Dim rs As Recordset 

Sheets("Sheet1").Select 
Cells.Select 
Selection.ClearContents 
Range("A1").Select 

Dim Q7 As String 
Q7 = "SELECT a.master_id, p.dob, a.eventdate, a.code, b.eventdate, b.code " _ 
    & "FROM data a WHERE a.code LIKE 'C10%' " _ 
    & "JOIN people p ON p.entity_id=a.master_id " _ 
    & "FROM data b WHERE (b.code LIKE '9Nu0%' OR b.code LIKE '9Nu1%') " _ 
    & "JOIN people p ON p.entity_id=b.master_id " _ 
    & "ORDER BY a.master_id, a.eventdate DESC " 

Set rs = conn.Execute(Q7) 
With ActiveSheet.QueryTables.Add(Connection:=rs, Destination:=Range("A1")) 
    .Refresh 
End With 

rs.Close 

End Sub

+0

Пожалуйста, явно предоставить ошибку, что вы испытываете. С быстрым взглядом ваши параметры sqlconnection выглядят неполными. Кажется, не указывает на конкретный сетевой ресурс вашего PostGreSQL db. – nbayly

+0

Соединение sql отлично работает для всего другого кодирования. Ошибка в этом конкретном разделе - это неожиданное объединение символов. Поскольку я не знаю, как это сделать. – BradleyS

+0

Не знаете, где вы получаете b.evendate, когда b.code является NULL в ваших результатах выборки – mo2

ответ

0

Смотрите демо здесь: http://rextester.com/QVXBLO35931

select a.master_id, p.dob, a.eventdate, a.code, max(b.eventdate), max(b.code) 
from people p 
join data a 
    on p.entity_id = a.master_id 
    and a.code like 'C10%' 
left outer join data b 
    on p.entity_id = b.master_id 
    and b.code like '9Nu%' 
group by a.master_id, p.dob, a.eventdate, a.code 
+1

Вы гений !!!! Большое спасибо – BradleyS

+0

Я только что узнал, что поиск данных для C10% (который является основной группой) также проводится в другой таблице с именем «prob». Это точно такая же структура, как и таблица данных. Возможно ли выполнить UNION ALL, объединяя данные и таблицу показателей> затем выполнить поиск по 9Nu% – BradleyS

+0

Да, вы можете объединить их вместе; нет необходимости в объединении, поскольку вам не нужны дубликаты из двух таблиц. Вы можете сделать это в обычном табличном выражении, и там тоже ваши фильтры. Также я заметил, что в своем примере я принимал максимум кода и eventdate отдельно. Это будет работать до тех пор, пока код для более высоких дат всегда будет выше. Если, например, masterid 69 имеет событие 01/05/1993 для кода 19Nu1, то вы получите значение eventdate из 19Nu0, но еще 19Nu1 в качестве кода. Поэтому, если это возможный запрос, нужно немного изменить, чтобы всегда принимать коды на основе max eventdate. – mo2

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