我有一个SQL查询,可为我提供“之前输出”图片中的输出。
如果本质上对column1中的项目在column1上进行了countif
,则类似于第5列,类似于Excel。
我想添加一些代码/子查询,以便输出变得像“ Output After”图片。
有人知道我该怎么做吗?
我可以使用VBA在excel中完成此操作,但是无法掌握如何在SQL中执行此操作。
答案 0 :(得分:0)
由于您使用的是SQL Server 2017,因此可以使用STRING_AGG
获得所需的内容:
select column1, column2, string_agg(column3, '&') as column3, column4
from outputbefore
group by column1, column2, column4
答案 1 :(得分:0)
您希望将多行连接为一个值。您的选择取决于您的SQL Server版本。在较旧的版本(我认为是2005+)中,您必须使用麻烦的XML过程。在您的服务器上运行它,您将看到它的工作原理,但我将留给您解决对数据的查询:
SELECT STUFF(
(SELECT ', <' + name + '>'
FROM sys.databases
WHERE database_id > 4
ORDER BY name
FOR XML PATH('') ,
ROOT('MyString') ,
TYPE
).value('/MyString[1]', 'varchar(max)'), 1, 2, '') AS namelist;
从SQL 2017开始,您可以使用STRING_AGG函数,here说明。
答案 2 :(得分:0)
我看到这是一个字符串连接问题。我使用替换来处理字符&XML。
select a.col1, Col3=replace(stuff((SELECT '#' + b.col3 AS 'data()'
FROM OutputBefore) b
where b.Col1=a.Col1
FOR XML PATH('')),1,1,''),'#','&')
from (select distinct Col1 from OutputBefore) a;
答案 3 :(得分:0)
如forpas和Russell所述,从SQL 2017开始,您可以使用STRING_AGG函数。
对于SQL 2008+ 再次参考:
How Stuff and 'For Xml Path' work in Sql Server
在您的情况下,您希望定界符为“&”,由于XML特殊字符,这将导致FOR XML PATH出现问题。因此,您需要转义XML特殊字符,例如:
DECLARE @TableA TABLE (Col1 NVARCHAR(10), Col2 INT, Col3 NVARCHAR(10), Col4
NVARCHAR(10), Col5 INT)
INSERT INTO @TableA (Col1, Col2, Col3, Col4, Col5)
VALUES ('Dave' , 24 , 'house' , 'married' , 2)
, ('Dave' , 24 , 'car' , 'married' , 2)
, ('Bob' , 32 , 'House' , 'single' , 1)
, ('George' , 12 , 'house' , 'divorced' , 1)
SELECT
t2.Col1
, t2.Col2
, STUFF ( ( SELECT '&' + Col3 -- Adding '&' as delimited
FROM @TableA t1
WHERE t1.Col2 = t2.Col2
FOR XML PATH (''), TYPE
).value('.', 'VARCHAR(MAX)'),1,1,''-- To escape special characters
) AS Col3
, t2.Col4
FROM @TableA AS t2
GROUP BY t2.Col1
, t2.Col2
, t2.Col4