TSQL - 使用 UNPIVOT 的帮助

Posted

技术标签:

【中文标题】TSQL - 使用 UNPIVOT 的帮助【英文标题】:TSQL - Help with UNPIVOT 【发布时间】:2010-01-21 21:58:37 【问题描述】:

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

这些位域不能为空,并且可能所有四个位域都可以为 1。

我怎样才能取消透视这个东西,以便我最终得到每个位字段的单独行 = 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

谢谢!

【问题讨论】:

【参考方案1】:

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】:

试试这个:

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

【讨论】:

感谢您的回答鲁本斯。我标记了它,但不得不接受 SQLMenace 的回答,就像他首先回答的那样正确。

以上是关于TSQL - 使用 UNPIVOT 的帮助的主要内容,如果未能解决你的问题,请参考以下文章

TSQL - 来自 Excel 导入数据的 UNPIVOT

如何从 TSQL UNPIVOT 中过滤值?

TSQL PIVOT/UNPIVOT 多个汇总列

需要帮助来提高一些 TSQL“不存在”的查询性能

TSQL 帮助 | INSERT 语句的选择列表包含的项目少于插入列表 [关闭]

请帮助将 Tsql“隐式连接”转换为显式连接