如何在记录位于不同行

时间:2018-01-29 15:06:51

标签: sql-server-2012

我有一个包含代码列表的数据集,记录分为两类,LDA

ID  Type
1   LD
2   A
1   A
1   LD
3   LD

这两个类别是根据他们的代码分配的。 但是,有一些记录的ID是相同的,它有一些类型为“LD”,一些类型为“A”。在这种情况下,我希望这些记录的“类型”列在下面说“LD_A”。 ID为1的所有记录都已更改为保留行数的LD_A(因为它们属于两种类型) -

ID  Type
1   LD_A
2   A
1   LD_A
1   LD_A
3   LD

有人可以指导我如何在sql中执行此操作吗?

3 个答案:

答案 0 :(得分:0)

按ID分组,只获取具有多个不同类型的ID。您可以使用此查询执行此操作:

SELECT ID FROM t GROUP BY ID HAVING COUNT(DISTINCT Type) > 1

然后将此查询加入UPDATE语句中的表以“过滤”记录。 (它也需要这样,因为您不能在更新查询中的同一个表上使用WHERE和子查询。)

无论如何,这是你的最终查询:

UPDATE t 
JOIN (SELECT ID FROM t GROUP BY ID HAVING COUNT(DISTINCT Type) > 1) ft USING (ID)
SET Type = 'LD_A';

答案 1 :(得分:0)

UPDATE mytable
JOIN mytable AS mytable2 ON mytable2.id=mytable.id AND mytable2.`Type`='A'
SET mytable.`Type`='LD_A', mytable2.`Type`='LD_A', 
WHERE mytable.`type`='LD';

这会查找类型为“LD”且记录“A”具有相同ID的所有记录,然后将两者更新为“LD_A”

答案 2 :(得分:0)

     --- SOURCE
                       IF ( EXISTS ( SELECT    *
                                  FROM      INFORMATION_SCHEMA.TABLES
                                  WHERE     TABLE_SCHEMA = 'dbo'
                                            AND TABLE_NAME = 'TBL' ) )
                        BEGIN
                            DROP TABLE TBL
                        END


                    CREATE TABLE TBL
                        (
                          id INT ,
                          [type] VARCHAR(10)
                        )

                    INSERT  INTO TBL
                    VALUES  ( 1, 'LD' ),
                            ( 2, 'A' ),
                            ( 1, 'A' ),
                            ( 1, 'LD' ),
                            ( 3, 'LD' )

        PRINT 'Before Update'
        SELECT * FROM TBL

--- QUERY
        ;WITH CTE AS (
                    SELECT  t.id ,
                            IIF(EXISTS ( SELECT 1
                                         FROM   ( SELECT    MAX(ctr) ctr ,
                                                            id
                                                  FROM      ( SELECT    ROW_NUMBER() OVER ( PARTITION BY id ORDER BY id ) ctr ,
                                                                        id
                                                              FROM      tbl
                                                            ) T
                                                  GROUP BY  id
                                                ) TblXT
                                         WHERE  TblXT.id = t.id
                                                AND ctr > 1 ), typeR, type) [typeNew],
                                                type
                    FROM    ( SELECT    id ,
                                        REPLACE(REPLACE(REPLACE(STUFF(( SELECT  QUOTENAME([TYPE])
                                                                        FROM    TBL
                                                                        GROUP BY [TYPE]
                                                                        ORDER BY type DESC
                                                                      FOR
                                                                        XML PATH('')
                                                                      ), 1, 0, ''), '][', '_'),
                                                        '[', ''), ']', '') [typeR] ,
                                        tbl.[type]
                              FROM      TBL
                            ) T

            )
        UPDATE CTE
        SET type = typeNew


        PRINT 'After Update'
        SELECT * FROM TBL

结果

    Before Update
    id          type
    ----------- ----------
    1           LD
    2           A
    1           A
    1           LD
    3           LD

    (5 row(s) affected)



    After Update
    id          type
    ----------- ----------
    1           LD_A
    2           A
    1           LD_A
    1           LD_A
    3           LD

    (5 row(s) affected)