T-SQL - вставить новую строку в таблицу из выбора группы из четырех строк - PullRequest
0 голосов
/ 10 июня 2019

Я регистрирую фильтры, которые пользователи выбирают в моем веб-приложении, и мне нужно создать новую строку, которая показывает, какую группу фильтров они выбрали.

Из-за способа, которым фильтры регистрируются в таблицеони входят в группы по четыре человека, которые можно увидеть на скриншоте ниже:

enter image description here

На основании этих групп по четыре мне нужно вставить новую строку, содержащуюстрока, разделенная запятыми, в поле Сообщение значения (значений) после символа:.

1 Ответ

0 голосов
/ 10 июня 2019

похоже, что нет идентификатора, который бы сгруппировал четыре строки (не видно полной метки времени в вашем образце). Вот пример с группирующим столбцом, который вычисляется на основе мода 4 и рекурсивного cte

DECLARE @tab TABLE (id int identity(1,1), msg varchar(100))

INSERT INTO @tab
VALUES
 ('selected: a')
,('selected: b')
,('selected: c')
,('selected: d')
,('selected: e')
,('selected: f')
,('selected: g')
,('selected: h')
,('selected: i')
,('selected: j')
,('selected: k')
,('selected: l')

;with src --add grouping column
as
(
SELECT 
    id
    ,msg = left(msg, charindex(':', msg, 1)-1)
    ,val = LTRIM(SUBSTRING(msg, CHARINDEX(':', msg, 1)+1, len(msg) ))
    ,nid = ROW_NUMBER() over (partition by id % 4 order by id)  
FROM @tab
)
,source --add column for recursion
as
(
    SELECT 
        *,
        rn = ROW_NUMBER() OVER (PARTITION BY nid ORDER BY id)
    FROM src
)
,rcdef -- define recursive cte
AS (
    SELECT 
        nid
        ,msg
        ,val = convert(varchar(max), val)
        ,rn = 1 
    FROM source 
    WHERE rn = 1
    UNION ALL 
    SELECT 
        rcdef.nid
        , rcdef.msg
        ,val = convert(varchar(max), rcdef.val +',' + source.val) --concatenate vals
        ,rn = rcdef.rn + 1
    FROM rcdef
        INNER JOIN source on source.nid = rcdef.nid  and source.rn = rcdef.rn + 1
)
SELECT 
    nid, 
    val = msg + ': ' + max(val)
FROM rcdef
GROUP BY nid, msg
...