在SQL中复制VBA解决方案

时间:2019-01-18 16:59:49

标签: sql sql-server vba transpose countif

我有一个SQL查询,可为我提供“之前输出”图片中的输出。
如果本质上对column1中的项目在column1上进行了countif,则类似于第5列,类似于Excel。
我想添加一些代码/子查询,以便输出变得像“ Output After”图片。

有人知道我该怎么做吗?
我可以使用VBA在excel中完成此操作,但是无法掌握如何在SQL中执行此操作。

之前输出
Output Before

之后输出
Output After

4 个答案:

答案 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