2016-07-08 36 views
0

值選擇列上多次一行我需要如下創建基於四個表報告:SQL如何根據其他列

Table A: Columns(record_id, contact_id, role_id) 

Table B: Columns(contact_id, fname, lname) 

Table C: Columns(role_id,role_description) 

Table D: Columns(Record_id, date) 

查詢:

select d.record_id,d.date,b.fname,b.lname,c.role_description 
from a,b,c,d 
where a.contact_id = b.contact_id and 
     a.role_id = c.role_id and 
     a.role_id in('legal','finance') and 
     a.record_id = d.record_id 

這個查詢會產生多行如下:

Record ID | Date | Fname | Lname | Role | 
============================================= 
1   |Jan 2 | Bob | Smith | Legal | 
---------------------------------------------- 
1   |Jan 2 | Jim | Jones | Finance | 
---------------------------------------------- 

我需要產生是這樣的:

----------------------------------------------------------------------------- 
record ID | Date | Legal User | Finance User |  
-------------------------------------------------------------------- 
1   | Jan 2 |Bob Smith | Jim Jones | 

我理解連接和連接,但無法弄清楚如何根據角色獲取一行上的2個用戶。

+1

請適當地標記您的問題。你真的在用什麼數據庫? –

+0

答案是非常不同的MySQL與微軟的SQL服務器,所以你在哪裏使用? – Matt

+0

Mssql .....不應該點擊了這麼多標籤...對不起 – CriminyJickets

回答

1
SELECT * 
FROM 
    (
     select d.record_id,d.date 
      ,b.fname + b.lname AS name 
      ,c.role_description + ' User' as role_description 
     from a,b,c,d 
     where a.contact_id = b.contact_id and 
      a.role_id = c.role_id and 
      a.role_id in('legal','finance') and 
      a.record_id = d.record_id 
    ) q 
    PIVOT 
    (
     MAX(name) 
     FOR role_description IN ([Legal User], [Finance User]) 
    ) 

您應該可以使用PIVOT。我知道這似乎很奇怪,因爲你正在使用一個varchar的MAX(),但它的工作原理是這樣。

根據您的意見,沒有被簡化,我會用這個去特定的語法:

SELECT * 
FROM 
    (
     select 
      d.ctx_id 
      ,effective_date, 
      b.first_name + b.last_name AS name 
      ,c.description 
     from 
      ctx_contract_contacts a 
      INNER JOIN ctx_contacts b 
      ON a.contact_id = b.contact_id 
      INNER JOIN code_lookup c 
      ON a.association = c.lookup_code 
      INNER JOIN ctx_basic_info d 
      ON a.ctx_id = d.ctx_id 
     where 
      and a.association in(117601,117759) 
    ) q 

    PIVOT 
    (
     MAX(name) 
     FOR description IN ([Legal Reviewer], [NDA reviewer]) 
    ) p 
+0

我給了它一個鏡頭,但在調整實際的db值時必須弄亂語法。我簡化了以使例子更清楚。以下是錯誤: – CriminyJickets

+0

不正確的語法「從」附近......它看起來我的權利,但我可能錯過了一個逗號或東西.. – CriminyJickets

+0

SELECT * FROM ( 選擇d.ctx_id,EFFECTIVE_DATE , b.first_name + b.last_name AS名 ,從ctx_contract_contacts一個c.description ,ctx_contacts b,code_lookup C,ctx_basic_info d 其中a.contact_id = b.contact_id和 a.association = c.lookup_code和 一個。 (117601,117759)和 a.ctx_id = d.ctx_id )q PIVOT ( MAX(name) FOR描述IN([Legal Reviewer],[NDA reviewer]) ) – CriminyJickets

0
select d.record_id,d.date, 
[legal user]=case role_id when 'legal' then b.fname +' '+b.lname 
[Finance user]=case role_id when 'finance' then b.fname +' '+b.lname 
from a,b,c,d 
where a.contact_id = b.contact_id and 
     a.role_id = c.role_id and 
     a.role_id in('legal','finance') and 
     a.record_id = d.record_id