代码之家  ›  专栏  ›  技术社区  ›  Gus

tsql-有关unpivot的帮助

  •  6
  • Gus  · 技术社区  · 16 年前

    我正在转换此旧表中的数据:
    Phones(ID int, PhoneNumber, IsCell bit, IsDeskPhone bit, IsPager bit, IsFax bit)

    这些位字段不可为空,并且可能所有四位字段都可以是1。

    如何取消对该对象的透视,以使每个位字段有一个单独的行结束= 一 .例如,如果原始表看起来像这样…

    ID, PhoneNumber, IsCell, IsPager, IsDeskPhone, IsFax
    ----------------------------------------------------
    1   123-4567     1       1        0            0
    2   123-6567     0       0        1            0
    3   123-7567     0       0        0            1
    4   123-8567     0       0        1            0
    

    …我希望结果如下:

    ID   PhoneNumber   Type
    -----------------------
    1    123-4567      Cell
    1    123-4567      Pager
    2    123-6567      Desk
    3    123-7567      Fax
    4    123-8567      Desk
    

    谢谢!

    2 回复  |  直到 16 年前
        1
  •  6
  •   SQLMenace    16 年前

    2005/2008版

    SELECT ID, PhoneNumber, Type
    FROM
    (SELECT ID, PhoneNumber,IsCell, IsPager, IsDeskPhone, IsFax
     FROM Phones) t
    UNPIVOT
    ( quantity FOR Type  IN
        (IsCell, IsPager, IsDeskPhone, IsFax)
    ) AS u
    where quantity = 1
    

    see also Column To Row (UNPIVOT)

        2
  •  3
  •   Rubens Farias    16 年前

    试试这个:

    DROP TABLE #Phones
    CREATE TABLE #Phones
    (
        Id int,
        PhoneNumber varchar(50),
        IsCell bit,
        IsPager bit,
        IsDeskPhone bit,
        IsFax bit
    )
    
    INSERT INTO #Phones VALUES (1, '123-4567', 1, 1, 0, 0)
    INSERT INTO #Phones VALUES (2, '123-6567', 0, 0, 1, 0)
    INSERT INTO #Phones VALUES (3, '123-7567', 0, 0, 0, 1)
    INSERT INTO #Phones VALUES (4, '123-8567', 0, 0, 1, 0)
    
    SELECT Id, PhoneNumber, [Type]
    FROM (
        SELECT  Id, PhoneNumber, 
                Cell = IsCell, Pager = IsPager, 
                Desk = IsDeskPhone, Fax = IsFax
        FROM #Phones
    ) a 
    UNPIVOT(
        something FOR [Type] IN (Cell, Pager, Desk, Fax )
    ) as upvt