1

Я хочу сделать подзапрос с 3 таблицами и использовать где в нескольких значениях, но я всегда получаю синтаксическую ошибку. Я должен делать отчеты в Report Builder 3.0Как выполнить подзапрос с тремя таблицами и использовать предложение where в нескольких значениях?

Таблица A: record_id, фамилия, имя

Таблица C: row_id, competency_code, competency_name

Table PC: link_id, record_id, row_id, attainment_date

Я хотел бы присоединиться к столам в 1 таблицу. У одного человека будет некоторое завершение класса competency_code и другое с другим человеком. завершение кода competency_code на основе достижения_даты. Я также думаю, что использовать функцию iff для attainment_date в значении competency_code как полное/да.

В таблице, что я хотел бы создать это:

Record_Id | Surname | GivenName | Code 1 | Code 2 | Code 3 | Code 4 | Code 5 
01  | AA  | AA  | Complete | Complete | Complete |   | Complete 
02  | BB  | BB  | Complete | Complete |   | Complete | 
03  | CC  | CC  |   | Complete | Complete |   | Complete 

вот вопрос, что я пытался сделать.

select distinct a.id, a.surname, a.given_name 
    from all a 
    join 
    (
    select pc.attainment_date 
    from personnel_competency pc 
    join 
    (
     select c.code, c.name 
     from competency c) 
     competency c on (c.row_no = pc.linkid) 
    ) 
    personnel_competency pc on (pc.id = a.id) 

    where c.code in ('ABC', 'BCD', 'ABE', 'DEA', 'DEF', 'POS', 'SAQ', 'LOP') 
    and pc.attainment_date < now() 
    order by a.record_id 

Мое умение в SQL является очень простым. Существуют ли другие способы сделать таблицу такой?

ответ

0

Вы ищете SQL для получения результата. Если это так, я думаю, что это то, что вы ищете. Это поможет, если вы разместите некоторые данные образца.

Вы можете проверить его на SQLFiddle

Вот сценарий ..

-- Generate schema and data 
create table tableA (id int, surname varchar(30), given_name varchar(30)); 
create table tablePC (link_id int, id int, attainment_date datetime); 
create table tableC (row_id int, competency_code varchar(20), Competency_name varchar(30)); 

insert into tableA (id, surname, given_name) 
values (1, 'AA', 'AAgn') 
, (2, 'BB', 'BBgn') 

insert into tablePC (link_id, id, attainment_date) 
values (1, 1, '2014-09-11') 
, (2, 1, '2014-09-10') 
, (3, 2, '2014-09-11') 

insert into tableC (row_id, competency_code, Competency_name) 
values (1, 'ABC', 'completed\Yes') 
, (1, 'BCD', 'completed') 
, (1, 'ABE', 'completed') 
, (2, 'ABC', 'completed') 
, (2, 'BCD', 'completed') 
, (3, 'ABC', 'completed') 
, (3, 'ABE', 'completed') 
-- =============== 

select * 
from tableA TA 
    inner join tablePC PC 
    on TA.id = PC.id 
    inner join 
    (
     select row_id, [ABC] as ABC, [BCD] as BCD, [ABE] as ABE 
     from tableC TC 
     pivot 
     (
      max(Competency_name) 
      for Competency_code in ([ABC], [BCD], [ABE]) 
     ) as TCPVT 
    ) TC  
    on PC.link_id = TC.row_id 
where PC.attainment_date < GETDATE() 
+0

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

+0

http://sqlfiddle.com/#!3/e92ab/1 Я пробовал это в SQLFiddle, но все же синтаксическую ошибку. –

+0

В создавшемся вами скрипте есть несколько ошибок (хорошая попытка). Пожалуйста, сначала поймите свои данные. Канал передачи данных между PC.link_id = Tc.row_id не может быть выполнен так, как ничто не соответствует на основе ваших данных, поэтому данные никогда не будут возвращены. Во-вторых, изучите синтаксис SQL, чтобы узнать, как построить запрос. Обновите [Ваш sqlfiddle.com/#!3/e92ab/64](http://sqlfiddle.com/#!3/e92ab/64) – Tak