1

上午所有,SQL CONCAT IF声明?

林不知道我怎么需要解决我下面的查询......我有以下查询其拉回到在SQL服务器所需的记录...

SELECT agenda.AgendaItemNumber,Agenda.AgendaName, AgendaType.AgendaTypeDescription, userdetails.fullName 
FROM Agenda 
JOIN AgendaType ON AgendaType.AgendaTypeID=Agenda.AgendaTypeID 
JOIN UserDetails ON Agenda.AgendaID = Userdetails.AgendaID 
WHERE agenda.AgendaTypeID = '2' 
AND AgendaItemNumber = AgendaItemNumber 
AND AgendaName = AgendaName 
AND AgendaTypeDescription = AgendaTypeDescription 
AND AgendaItemNumber >= '3' 

以上查询工作,但我需要稍微加强这一点。它拉回到下面的结果,它本质上是除了“全名”列重复记录......

Results_image

我想要做的是能一些额外的代码添加到该查询,以便当我运行查询时,我可以显示每个'AgendaItemNumber'的一个记录,并为它连接这个记录的两个全名。但是,我在此表中只有1个用户全名分配给他们的附加AgendaItemsNumbers。它只是在图像文件中的这几个记录我需要做一些聪明的事情。

也许有更好的方法来完成这项任务?

许多在此先感谢。任何疑问,请不要犹豫,问。

问候 贝蒂

+1

“AND AgendaItemNumber = AgendaItemNumber ...”。嗯,为什么? – adelphus 2012-03-12 11:33:41

+0

** AND AgendaItemNumber = AgendaItemNumber AND AgendaName = AgendaName AND AgendaTypeDescription = AgendaTypeDescription **没有意义。也可以使用** INNER JOIN ** – Kaf 2012-03-12 11:35:01

回答

4
SELECT agenda.AgendaItemNumber, 
     Agenda.AgendaName, 
     AgendaType.AgendaTypeDescription, 
     STUFF((SELECT ';' + FullName 
       FROM UserDetails 
       WHERE UserDetails.AgendaID = Agenda.AgendaID 
       FOR XML PATH('') 
      ), 1, 1, '') AS fullName 
FROM Agenda 
     INNER JOIN AgendaType 
      ON AgendaType.AgendaTypeID=Agenda.AgendaTypeID 
     INNER JOIN UserDetails 
      ON Agenda.AgendaID = Userdetails.AgendaID 
WHERE agenda.AgendaTypeID = '2' 
AND  AgendaItemNumber = AgendaItemNumber 
AND  AgendaName = AgendaName 
AND  AgendaTypeDescription = AgendaTypeDescription 
AND  AgendaItemNumber >= '3' 

ADENDUM

在SQL-Server中的XML扩展可以让你多行连接成一行。扩展的实际意图是让你可以输出为XML(显然),但是有一些漂亮的技巧是扩展的副产品。在上面的查询中,如果在子查询(FullName)中有一个列名,它将输出为<FullName>Joe Bloggs1</FullName><FullName>Joe Bloggs2</FullName>,因为没有列名,它只是连接行(不形成正确的XML)。 PATH部分允许你指定一个额外的节点,例如,如果你在上面使用PATH('Name'),你会得到<Name>;Joe Bloggs</Name><Name>;Joe Bloggs2</Name>如果你将Path与列名结合起来,你会得到Joe Bloggs。

最后,STUFF只是在列表的开始处删除分号。

+0

@GarethD非常感谢上述查询。这smmems工作的一种享受。我可以问一下XML Path是干什么的?实质上是FullName列的查询的CONCAT部分。不太确定查询的....,1,1''部分是什么。然而这是个窍门。非常感谢。 – Betty 2012-03-12 12:00:57

+0

@adelphus添加说明。 – GarethD 2012-03-12 12:16:16

+0

@Betty'STUFF(.. 1,1,'')'部分只是删除第一个分号,因此您得到“Name1; Name2”而不是“; Name1; Name2”。你可以使用'FullName +';''并且完全移除'STUFF'来获得像这样的列表“Name1; Name2;” – GarethD 2012-03-12 12:16:40