在SQL中复制VBA解决方案

在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查询,它在“output Before”pic中为我提供了输出。 第5列,基本上是对第1列中的项目进行计数,类似于Excel。 我想添加一些代码/子查询,以便输出变得像“output After”pic

有人知道我该怎么做吗? 我可以用VBA在excel中完成它,但就是不知道如何在SQL中完成它

前输出

输出后

由于您使用的是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