Несколько значений строки в одно для повторяющихся значений - PullRequest
0 голосов
/ 05 июля 2018

Если ID повторяется, я должен переместить значения C (строка 1) для столбца 1 и значения D (строка 1) для столбца 2,
значения C (строка 2) для столбца 3 и значения D (строка 2) для столбца 4, значения C (строка 3) для столбца 5 и значения D (строка 3) для столбца 6, Есть ли способ, которым мы можем сделать это в SQL

Спасибо

ID  B   C       D   1   2   3   4   5   6
1   Hat Device1 34                      
2   Mat Device2 65                      
3   Cat Device3 76                      
3   Sat Device4 34                      
3   Hat Device5 89                      
4   Hat Device6 23                      
4   Hat Device7 12      



ID  B   1       2   3      4    5   6
1   Hat Device1 34              
2   Mat Device2 65              
3   Cat Device3 76  Device4 34  Device5 89
4   Hat Device6 23      

Ответы [ 2 ]

0 голосов
/ 05 июля 2018
CREATE TABLE #input (ID INT, B VARCHAR(10), C VARCHAR(15), D INT, [1] VARCHAR(15), [2] INT, [3] VARCHAR(15), [4] INT,[5] VARCHAR(15), [6] INT)
CREATE TABLE #output (ID INT, B VARCHAR(10), [1] VARCHAR(15), [2] INT, [3] VARCHAR(15), [4] INT, [5] VARCHAR(15), [6] INT)

INSERT INTO #input (ID,B,C,D)
VALUES (1,'Hat', 'Device1', 34 )

INSERT INTO #input (ID,B,C,D)
VALUES (2,'Mat', 'Device2', 65 )

INSERT INTO #input (ID,B,C,D)
VALUES (3,'Cat', 'Device3', 76 )

INSERT INTO #input (ID,B,C,D)
VALUES (3,'Sat', 'Device4', 34 )

INSERT INTO #input (ID,B,C,D)
VALUES (3,'Hat', 'Device5', 89 )

INSERT INTO #input (ID,B,C,D)
VALUES (4,'Hat', 'Device6', 76 )

INSERT INTO #input (ID,B,C,D)
VALUES (4,'Hat', 'Device7', 12 )

DECLARE 
    @id INT,
    @b VARCHAR(10),
    @c VARCHAR(15),
    @d INT



    DECLARE input CURSOR FOR SELECT ID, B, C, D FROM #input
    OPEN input
    FETCH NEXT FROM input INTO @id, @b, @c, @d
    WHILE @@fetch_status <> -1
    BEGIN

        IF @id NOT IN (SELECT ID FROM #output)
        BEGIN

            INSERT INTO #output (ID,B,[1],[2])
            VALUES (@id, @b, @c, @d )

        END
        ELSE IF @id IN (SELECT ID FROM #output) AND (SELECT [3] FROM #output WHERE ID = @id) IS NULL
        BEGIN
            UPDATE #output 
            SET [3] = @c,
            [4] = @d
            WHERE ID = @id
        END
        ELSE
        BEGIN
            UPDATE #output 
            SET [5] = @c,
            [6] = @d
            WHERE ID = @id
        END

            FETCH NEXT FROM input INTO @id, @b, @c, @d
    END
    CLOSE input
    DEALLOCATE input

SELECT * FROM #input
SELECT * FROM #output
DROP TABLE #input
DROP TABLE #output

Вы можете попробовать это здесь:

https://dbfiddle.uk/?rdbms=sqlserver_2012&fiddle=bb3f59d0df1ddfdfba8d31c38b742919

0 голосов
/ 05 июля 2018

Вы можете использовать условное агрегирование:

select id, min(b) as b,
       max(case when seqnum = 1 then c end) as [1],
       max(case when seqnum = 1 then d end) as [2],
       max(case when seqnum = 2 then c end) as [3],
       max(case when seqnum = 2 then d end) as [4],
       max(case when seqnum = 3 then c end) as [5],
       max(case when seqnum = 3 then d end) as [6]
from (select t.*, row_number() over (partition by id order by id) as seqnum
      from t
     ) t
group by id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...