Репликация решения VBA в SQL - PullRequest
0 голосов
/ 18 января 2019

У меня есть SQL-запрос, который выводит меня на рисунок «Вывод до».
Столбец 5, если по существу выполняется countif для столбца 1 для элементов в столбце 1, аналогично Excel.
Я хотел бы добавить некоторый код / ​​подзапрос, чтобы вывод был похож на рисунок «Вывод после».

У кого-нибудь есть идеи, как мне это сделать?
Я могу сделать это в Excel с VBA, но просто не могу понять, как это сделать в SQL.

Вывод до
Output Before

Вывод после
Output After

Ответы [ 4 ]

0 голосов
/ 18 января 2019

Как уже упоминали forpas и Russell, начиная с SQL 2017 вы можете использовать функцию STRING_AGG.

Для SQL 2008+ Обратитесь к этому:

Как работают вещи и «для пути XML» в Sql Server

В вашем случае вы хотите, чтобы разделитель был '&', что вызовет проблему с FOR XML PATH из-за специального символа XML. Итак, вы захотите экранировать специальные символы 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
0 голосов
/ 18 января 2019

Вы хотите объединить несколько строк в одно значение. Ваши параметры зависят от вашей версии 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, объясненную здесь .

0 голосов
/ 18 января 2019

Как я вижу, это проблема конкатенации строк. Я использовал замену для обработки символа & в 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;
0 голосов
/ 18 января 2019

Поскольку вы используете SQL Server 2017, вы можете получить то, что вы хотите, с помощью STRING_AGG:

select column1, column2, string_agg(column3, '&') as column3, column4
from outputbefore
group by column1, column2, column4
...