2016-01-05 87 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此表爲每個「表單名稱」,並創建一個列每個用戶一行。 「表單名稱」需要是動態的,因爲沒有有限的表單名稱集。

如果就是我希望做到的,是可能的,它會產生如下結果: enter image description here

我一直在努力得到這個權利!預先感謝您提供的任何指導。

+1

這將有助於看到你到目前爲止的嘗試。請添加您嘗試過的內容,以及它如何失敗(錯誤消息或錯誤輸出)。在簡單情況下,您是否成功使用過PIVOT,或者您是第一次使用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