2016-01-05 3 views
2

Я написал следующий запрос, который производит ниже вывод:Использование SQL PIVOT с JOINS

SELECT 
users.user_id AS 'User ID', 
users.first_name AS 'First Name', 
users.last_name AS 'Surname', 
users.login AS 'Username', 
CASE users.type WHEN 0 THEN 'Student' WHEN 1 THEN 'Staff Member' WHEN 2 THEN 'Guest/Other' END AS 'User Type', 
CASE users.active WHEN 1 THEN 'Active' ELSE 'Inactive' END AS 'User Status', campuses.campus_name AS 'Campus', users.year_level AS 'Year Level', 
users.class AS 'Class', 
CASE users.eligible WHEN 1 THEN 'Yes' ELSE 'No' END AS 'Eligible', 
forms.form_title AS 'Form Name', 
users_forms_map.date AS 'Date Returned' 

FROM users_forms_map 
INNER JOIN users ON users_forms_map.user_fk = users.pk 
INNER JOIN campuses ON users.campus_id=campuses.campus_id 
INNER JOIN forms ON users_forms_map.form_id=forms.form_id 

enter image description here

Я хотел бы PIVOT эту таблицу, чтобы создать столбец для каждого «Form Name» и одна строка для каждого пользователя. «Имя формы» должно быть динамическим, так как нет конечного набора имен форм.

Если то, что я надеюсь, что для достижения возможно, он будет производить следующий результат: enter image description here

Я изо всех сил, чтобы получить это право! Заранее благодарим за любые рекомендации, которые вы можете предложить.

+1

Это поможет вам увидеть, к чему вы дошли, с точки зрения попытки до сих пор. Пожалуйста, добавьте то, что вы пробовали, и как оно работает (сообщение об ошибке или неправильный вывод). Вы успешно использовали PIVOT раньше в простом случае, или это вы впервые используете его? – dsz

+2

Лучше всего сделать в приложении, если это возможно. Любой заданный запрос всегда возвращает набор результатов с фиксированной формой - числом, именем и типами столбцов. Вы можете построить динамический запрос, но он будет уродлив, и большинство языков программирования приложений/сборщиков отчетов имеют лучшие возможности для выполнения этой задачи. –

ответ

0

Наиболее эффективным решением было справиться с этой логикой внутри самого приложения. Не удалось выполнить SQL-решение на стороне сервера.

0

Если вы нормально с выполнением нескольких шагов, попробуйте, как показано ниже

create table #form 
(
userid int, 
name varchar(50), 
surname varchar(50), 
username varchar(50), 
type varchar(50), 
userstatus varchar(50), 
campus varchar(50), 
level int , 
class varchar(1), 
eligible varchar(5), 
formname varchar(50), 
datereturned datetime 
) 

insert into #form 
values 
(123, 'thomas', 'pagram', 'tpar2', 'staff member', 'active', 'primary campus', 
0, '', 'yes', 'participation form', '2015-12-29') 


insert into #form 
values 
(123, 'thomas', 'pagram', 'tpar2', 'staff member', 'active', 'primary campus', 
0, '', 'yes', 'one2one contract', '2016-01-01') 



--drop table #form1 


select userid, name, surname, username, type, userstatus, campus, level, class,eligible, 
cast ('' as date) [participation form] , cast ('' as date) [one2one contract] 
into #form1 
from #form 
group by userid, name, surname, username, type, userstatus, campus, level, class,eligible 


update f1 
set [participation form] = f.datereturned 
from #form1 f1 
join #form f 
on (f.userid = f1.userid) 
where f.formname = 'participation form' 

    update f1 
set [one2one contract] = datereturned 
from #form1 f1 
join #form f 
on (f.userid = f1.userid) 
where f.formname = 'one2one contract' 


userid name surname username type   userstatus campus  level class  eligible  participation form one2one contract 
123 thomas pagram tpar2  staff member active  primary campus 0   yes   2015-12-29   2016-01-01 
Смежные вопросы