Sql server 如何在sql server中使用组_concat进行查询
我知道在sql server中,我们不能使用Sql server 如何在sql server中使用组_concat进行查询,sql-server,string-aggregation,sql-server-group-concat,Sql Server,String Aggregation,Sql Server Group Concat,我知道在sql server中,我们不能使用Group\u concat函数,但我有一个问题,我需要Group\u concat我的查询。我在谷歌上找到了一些逻辑,但无法更正。我的sql查询是 select m.maskid,m.maskname,m.schoolid,s.schoolname, md.maskdetail from tblmask m join school s on s.id = m.schoolid join maskdetails md on m.maskid = m
Group\u concat
函数,但我有一个问题,我需要Group\u concat
我的查询。我在谷歌上找到了一些逻辑,但无法更正。我的sql查询是
select m.maskid,m.maskname,m.schoolid,s.schoolname,
md.maskdetail
from tblmask m join school s on s.id = m.schoolid
join maskdetails md on m.maskid = md.maskid
order by m.maskname ;
它给了我这样的结果
只需查看该maskid、maskname、schoolid、schoolname中的前3行,它们是相同的,但maskdetail是不同的,所以希望最后一列中的一行可以包含每个maskid的所有maskdetail,依此类推
我希望我的输出像
等等。请帮我查询一下
提前感谢。查询:
SELECT
m.maskid
, m.maskname
, m.schoolid
, s.schoolname
, maskdetail = STUFF((
SELECT ',' + md.maskdetail
FROM dbo.maskdetails md
WHERE m.maskid = md.maskid
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM dbo.tblmask m
JOIN dbo.school s ON s.ID = m.schoolid
ORDER BY m.maskname
其他信息:
SELECT
m.maskid
, m.maskname
, m.schoolid
, s.schoolname
, maskdetail = STUFF((
SELECT ',' + md.maskdetail
FROM dbo.maskdetails md
WHERE m.maskid = md.maskid
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM dbo.tblmask m
JOIN dbo.school s ON s.ID = m.schoolid
ORDER BY m.maskname
请运行以下查询,在您的情况下,它不需要STUFF和GROUP BY:
Select
A.maskid
, A.maskname
, A.schoolid
, B.schoolname
, CAST((
SELECT T.maskdetail+','
FROM dbo.maskdetails T
WHERE A.maskid = T.maskid
FOR XML PATH(''))as varchar(max)) as maskdetail
FROM dbo.tblmask A
JOIN dbo.school B ON B.ID = A.schoolid
这也可以通过使用MSSQL 2008中的标量值函数来实现 声明您的函数如下:
CREATE FUNCTION [dbo].[FunctionName]
(@MaskId INT)
RETURNS Varchar(500)
AS
BEGIN
DECLARE @SchoolName varchar(500)
SELECT @SchoolName =ISNULL(@SchoolName ,'')+ MD.maskdetail +', '
FROM maskdetails MD WITH (NOLOCK)
AND MD.MaskId=@MaskId
RETURN @SchoolName
END
然后您的最终查询将是
SELECT m.maskid,m.maskname,m.schoolid,s.schoolname,
(SELECT [dbo].[FunctionName](m.maskid)) 'maskdetail'
FROM tblmask m JOIN school s on s.id = m.schoolid
ORDER BY m.maskname ;
注意:您可能需要更改函数,因为我不知道完整的表结构。+1。顺便说一句,
groupby
这里不需要。hmmm你能解释一下@Devart吗?我的意思是内部连接会产生像图像中那样的结果…所以要将所有重复的m.maskid、m.maskname、m.schoolid、s.schoolname组合到一行,我们需要通过tblmask
-maskdetails
=1到多个,,所以记录的副本不应该出现在这里。与@amitsigh的asnwer中简单的路径(“”)、键入和.value(“”、'NVARCHAR(MAX)
相比,这里使用路径(“”)
的原因是什么?您的变体产生了一种方式,一种更重的执行计划,它是否有一些隐藏的优势来证明成本的合理性?如果没有,你会纠正或修改你的答案,因为它被接受,并且应该是最好的一个?好的,我知道了。Amit Singh的答案将返回XML编码的字符串(因为for XML
select的结果是一个XML文本/对象),因此,例如,奇妙的工作方式就像一个满足我需要的符咒+1STUFF需要去掉第一个逗号,在您的案例中,maskdetail以逗号结尾。自从SQL Server 2017中添加了以来,它与关于SQL Server 2005的问题并不完全相同,因此,如果您有幸拥有最新的SQL Server,您可能希望了解这一点。另请参阅: