在SQL中复制VBA解决方案
我有一个SQL查询,它在“output Before”pic中为我提供了输出。 第5列,基本上是对第1列中的项目进行计数,类似于Excel。 我想添加一些代码/子查询,以便输出变得像“output After”pic 有人知道我该怎么做吗? 我可以用VBA在excel中完成它,但就是不知道如何在SQL中完成它 前输出 输出后在SQL中复制VBA解决方案,sql,sql-server,vba,transpose,countif,Sql,Sql Server,Vba,Transpose,Countif,我有一个SQL查询,它在“output Before”pic中为我提供了输出。 第5列,基本上是对第1列中的项目进行计数,类似于Excel。 我想添加一些代码/子查询,以便输出变得像“output After”pic 有人知道我该怎么做吗? 我可以用VBA在excel中完成它,但就是不知道如何在SQL中完成它 前输出 输出后 由于您使用的是SQL Server 2017,因此您可以通过字符串\u AGG获得所需内容: 您希望将多行连接成一个值。您的选项取决于您的SQL Server版本。在较旧
由于您使用的是SQL Server 2017,因此您可以通过字符串\u AGG获得所需内容:
您希望将多行连接成一个值。您的选项取决于您的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函数,如前所述。我认为这是一个字符串连接问题。我使用replace来处理字符&在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;
正如forpas和Russell所提到的,从SQL 2017开始,您可以使用STRING_AGG函数 对于SQL 2008+ 请再参考以下内容: 在本例中,您希望分隔符为“&”,这将由于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
在询问数据库问题时,请说明您使用的数据库类型。Microsoft SQL Server Management Studiot用于访问数据库的软件。不是数据库/version.SQL Server 17。很抱歉,如果Dave的第2列中有不同的值,那么输出应该是什么样子?
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