2016-04-14 61 views
0
if object_id('tempdb.dbo.#ctp', 'u') is not null 
    drop table #ctp ; 
create table #ctp(id int, mastername varchar(16)) ; 
insert into #ctp values(1, 'Big Boy') ; 

if object_id('tempdb.dbo.#client', 'u') is not null 
    drop table #client ; 
create table #client(id int, name varchar(16), type int) ; 
insert into #client values(1, 'ABC', 5) ; 
insert into #client values(2, 'XYZ', 6) ; 

if object_id('tempdb.dbo.#ctpclient', 'u') is not null 
    drop table #ctpclient ; 
create table #ctpclient(id int, ctpfk int, clientfk int) ; 
insert into #ctpclient values(1, 1, 1) ; 
insert into #ctpclient values(2, 1, 2) ; 

select tp.mastername 
     , c.name 
     , c.type 
     , cc.ctpfk 
     , cc.clientfk 
from  #ctp tp 
join  #ctpclient cc 
    on  tp.id = cc.ctpfk 
join  #client c 
    on  c.id = cc.clientfk 
    ; 

電流輸出SQL Server - 從兩行,一列到一行,兩列?

mastername|name|type 
Big Boy|ABC|5 
Big Boy|XYZ|6 

而不是輸出的兩排,我想輸出到如下:

mastername|nameone|nametwo 
Big Boy | ABC | XYZ 

什麼是做這個因爲我的最佳方式一個多對多的表,如#ctpclient?

+3

閱讀關於[PIVOT](https://technet.microsoft.com/en-us/library/ms177410(v = sql.105).aspx) –

回答

0

假設您總是有2行,您可以使用交叉表(又稱條件聚合)。它看起來像這樣。

with SortedValues as 
(
    select tp.mastername 
     , c.name 
     , ROW_NUMBER() over (partition by mastername order by clientfk) as RowNum 
    from #ctp tp 
    join #ctpclient cc on tp.id = cc.ctpfk 
    join #client c on c.id = cc.clientfk 
) 

select mastername 
    , MAX(case when RowNum = 1 then name end) as NameOne 
    , MAX(case when RowNum = 2 then name end) as NameTwo 
from SortedValues 
group by mastername 

如果你有不同的數字,你仍然可以完成,但它有點複雜。

+0

當然,這是一個非常簡單的例子。有什麼作品,而不是一個小組,我實際上有大約20個需要分組的其他字符列。這個問題有其他技術嗎?我正在考慮SELECT語句中的一些子類,但真的不知道最好的方法來做到這一點... – tbellmer

+0

爲什麼你不能只添加額外的列和組?無論採取什麼方法,您都必須在某個時間輸入所有列名。 –