Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何连接id引用,而不是简单地显示count(*)?_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 如何连接id引用,而不是简单地显示count(*)?

Sql 如何连接id引用,而不是简单地显示count(*)?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我这样做是为了演示: 模式: 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 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)
到目前为止我得到的问题是:

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
上面的查询显示了每个专业人员使用distinct进行过滤的地区数,并且只显示了在多个地区工作且具有以下特征的专业人员:

好的,但是。。是否可以在
区域中显示每个像
“2,5”
那样加入的idTerritory,而不是
计数(*)


提前感谢。

必要时,我通常使用FOR XML函数来执行这种多行串联。我认为这个查询符合您的要求:

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

我用这个博客来创建我的答案:

你肯定在找这样的东西吗@西兰热。我认为这有助于加入战场,但我不知道如何进入战场:-/伙计,你是个忍者!谢谢:)如果您不使用
、root('XMLVal')、type).value('/XMLVal[1]'、'varchar(max)
部分,那么使用或不使用它都会减少开销。@JamieD77,该部分代码处理将任何XML转义字符转换回纯文本的过程。因为此源数据没有特殊字符(、“、”或&),如果您完全确定这些字符不会出现在您的数据中(例如:您只处理数值),则最好不要使用该代码。
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