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 的帮助的主要内容,如果未能解决你的问题,请参考以下文章