将多个行值合为一用于重复值

时间:2018-07-05 14:28:45

标签: sql sql-server sql-server-2008

如果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 :(得分:0)

您可以使用条件聚合:

import numpy as np

x = ['hello', 'John', 'hi', 'John', 'hello', 'pumpum']

vals, ids, idx = np.unique(x, return_index=True, return_inverse=True)

print(idx)

array([1, 0, 2, 0, 1, 3], dtype=int64)

答案 1 :(得分:0)

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

您可以在这里尝试:

improved a little