2016-03-22 10 views
1

Bu pasajı göstermek için yaptım: http://sqlfiddle.com/#!6/ed243/2Basitçe sayımı (*) göstermek yerine kimlik oluşumlarına nasıl katılır?

Şema:

create table professional(
    id int identity(1,3) primary key, 
    name varchar(20) 
) 
insert into professional values('professional A') 
insert into professional values('professional B') 
insert into professional values('professional C') 

create table territory(
    id int identity(2,3) primary key, 
    name varchar(20) 
) 
insert into territory values('territory A') 
insert into territory values('territory B') 
insert into territory values('territory C') 

create table panel(
    id int identity(3,3) primary key, 
    idProfessional int not null, 
    idTerritory int not null, 
) 
insert into panel values(1, 2) 
insert into panel values(4, 5) 
insert into panel values(7, 8) 
insert into panel values(1, 5) 
insert into panel values(7, 8) 
insert into panel values(7, 2) 

Ve şu ana kadar var sorgusu:

select 
    p.id, p.name, count(*) as Territories 
from 
    (select distinct idProfessional, idTerritory from panel) panel 
inner join 
    professional p 
    on p.id = panel.idProfessional 
group by 
    p.id, 
    p.name 
having count(*) > 1 
order by p.id 

yukarıdaki sorgu sonucunda gösteriliyorsa kaç topraklarında her profesyonel, ile farklı filtrelemeyi ve yalnızca birden fazla terrede çalışan profesyonelleri göstererek çalışır sahip itory:

------------------------------------------------------- 
| id | name    | Territories | 
------------------------------------------------------- 
| 1  | professional A | 2    | 
| 7  | professional C | 2    | 
------------------------------------------------------- 

Tamam, ama .. her idTerritory"2, 5" yerine count(*) gibi katıldı Territories göstermek mümkün mü?

Şimdiden teşekkürler.

+0

Oldukça emin böyle bir şey arıyor ?? [SQL Server'da grup \ _concat MySQL işlevini simüle etmek mi?] (Http://stackoverflow.com/questions/451415/simulating-group-concat-mysql-function-in-sql-server) –

+0

@SeanLange. Alanlara katılmaya yardımcı olabileceğini düşünüyorum, ancak bu alanları nasıl alacağımı bilmiyorum: -/ –

cevap

1

Gerekli olduğunda, genellikle birden çok satırın bu şekilde birleştirme işlemini yapmak için FOR XML işlevini kullanırım.

select 
    p.id, p.name, STUFF(
     (select ', ' + CAST(t.id AS VARCHAR(10)) 
     from panel panel2 
     inner join territory t 
      ON t.id = panel2.idTerritory 
     where panel2.idProfessional = p.id 
     order by t.name 
     for xml path(''), root('XMLVal'), type 
    ).value('/XMLVal[1]','varchar(max)') 
    , 1, 2, '') as Territories 
from panel 
inner join 
    professional p 
    on p.id = panel.idProfessional 
group by 
    p.id, 
    p.name 
having count(*) > 1 
order by p.id 

cevabımı oluşturmada bu blogu kullandı:: Ben bu sorgu aradığınız yapar düşünüyorum http://sqlblog.com/blogs/rob_farley/archive/2010/04/15/handling-special-characters-with-for-xml-path.aspx

+0

İnsan, sen bir ninja'sın! Teşekkür ederim :) –

+0

, 'root' ('XMLVal'), yazın .value ('/ XMLVal [1]', 'varchar (max)' bölümünden ayrılırsanız, bu, http: // sqlfiddle yükünü azaltır. com/#! 3/ec791/1 – JamieD77

+0

Kullanarak ya da kullanmama aynı? –