Не уверен насчет сценария ниже. Нужно немного пу sh. Как я могу решить ниже sql сценарий - PullRequest
0 голосов
/ 12 апреля 2020

Ввод:

COL1    COL2
---------------
10      a
20      b
30      c
40      NULL
50      d

Желаемый вывод:

COL1    COL2
-----------------
10      a
20      a,b
30      a,b,c
40      a,b,c
50      a,b,c,d

Ниже приведено решение, которое я пробовал до сих пор. Но это не возвращает желаемый результат.

WITH CTE AS 
(
    SELECT 
        COL1, 
        LAG(COL2) OVER (ORDER BY COL1) AS prev_word,
        COL2
    FROM
        dbo.Scenario
), CTE_A AS 
(
    SELECT 
        COL1, COL2, prev_word, 
        CONCAT(ISNULL(Prev_word, ''), ' ', ISNULL(COL2, '')) AS Con_Word
    FROM 
        CTE
)
SELECT * 
FROM CTE_A

Ответы [ 3 ]

2 голосов
/ 12 апреля 2020

попробуйте следующее:

declare @t table (COL1 int, COL2 varchar(max))
insert into @t select 10, 'a'
insert into @t select 20, 'b'
insert into @t select 30, 'c'
insert into @t select 40, NULL
insert into @t select 50, 'd'

select COL1, STUFF(
                (
                    SELECT DISTINCT ',' + COL2 FROM @t t2 
                    WHERE t.COL1 >= t2.COL1  for xml path('')
                ),1,1,''
            ) AS COL2
from @t t
2 голосов
/ 12 апреля 2020

Одним из возможных решений является следующее утверждение. Я предполагаю, что значения в столбце COL1 определяют порядок, необходимый для агрегации.

Таблица:

CREATE TABLE Data (
   COL1 int,
   COL2 varchar(1)
)
INSERT INTO Data (COL1, COL2)
VALUES
   (10, 'a'),
   (20, 'b'),
   (30, 'c'),
   (40, NULL),
   (50, 'd')

Оператор для SQL Сервер 2012:

SELECT d.COL1, STUFF(a.COL2, 1, 1, '') AS COL2
FROM Data d
CROSS APPLY (
   SELECT CONCAT(',', COL2)
   FROM Data
   WHERE COL1 <= d.COL1 AND COL2 IS NOT NULL
   ORDER BY COL2
   FOR XML PATH('')
) a (COL2)
ORDER BY d.COL1

Оператор для SQL Server 2017+ (с использованием STRING_AGG () для агрегирования строк):

SELECT d1.COL1, STRING_AGG(d2.COL2, ',') WITHIN GROUP (ORDER BY d2.COL1) AS COL2
FROM Data d1
JOIN Data d2 ON d1.COL1 >= d2.COL1
WHERE d2.COL2 IS NOT NULL
GROUP BY d1.COL1
ORDER BY d1.COL1

Результат:

COL1 COL2
10   a
20   a,b
30   a,b,c
40   a,b,c
50   a,b,c,d
0 голосов
/ 13 апреля 2020
SELECT ID,STUFF((SELECT DISTINCT ',' + [Values] FROM Table_ t2 
WHERE t.ID>= t2.ID  for xml path('')),1,1,'') AS [Values]
FROM Table_ t
...