带字符串的TSQL枢轴

带字符串的TSQL枢轴,sql,sql-server,string,tsql,pivot,Sql,Sql Server,String,Tsql,Pivot,很抱歉,我知道这是一个在不同情况下被多次回答的问题。然而,经过一个小时的尝试,我发现的例子未能适应我的需要,我的结论是,我是一个白痴,需要帮助具体到我的数据 我有一个返回数据的视图,如下所示: SELECT * FROM vwPersonMainContactDetails PersonID | Mobile | Email ----------+----------------+-------------------------- 1 07777

很抱歉,我知道这是一个在不同情况下被多次回答的问题。然而,经过一个小时的尝试,我发现的例子未能适应我的需要,我的结论是,我是一个白痴,需要帮助具体到我的数据

我有一个返回数据的视图,如下所示:

SELECT * 
FROM vwPersonMainContactDetails
PersonID  |  Mobile        |  Email
----------+----------------+--------------------------
1            07777 777777     bob@abc.com
2            07766 666666     kate@abc.com
3            07755 555555     jo@abc.com
输出:

PersonID  | ContactMethod   | ContactValue
----------+-----------------+-----------------
1           Email             Bob@abc.com
1           Mobile            07777 777777
2           Email             kate@abc.com
2           Mobile            07766 666666
3           Email             jo@abc.com
3           Mobile            07755 555555
我需要返回的数据结构如下:

SELECT * 
FROM vwPersonMainContactDetails
PersonID  |  Mobile        |  Email
----------+----------------+--------------------------
1            07777 777777     bob@abc.com
2            07766 666666     kate@abc.com
3            07755 555555     jo@abc.com
有人能帮忙吗?我知道PIVOT将是答案,但我真的很努力让它为我工作

非常感谢


Andrew

如果您使用的是SQL Server 2005+,则可以执行以下操作:

SELECT
    *
FROM
(
SELECT
    PersonID,
    ContactMethod,
    ContactValue
FROM
    vwPersonMainContactDetails
) AS SourceTable
PIVOT
(
    MAX(ContactValue)
    FOR ContactMethod IN ([Email],[Mobile])
) AS pvt
SELECT
    PersonID,
    MAX(CASE WHEN ContactMethod='Mobile' THEN ContactValue ELSE NULL END) AS Mobile,
    MAX(CASE WHEN ContactMethod='Email' THEN ContactValue ELSE NULL END) AS Email
FROM
    vwPersonMainContactDetails
GROUP BY
    PersonID
如果不使用mssql,可以执行以下操作:

SELECT
    *
FROM
(
SELECT
    PersonID,
    ContactMethod,
    ContactValue
FROM
    vwPersonMainContactDetails
) AS SourceTable
PIVOT
(
    MAX(ContactValue)
    FOR ContactMethod IN ([Email],[Mobile])
) AS pvt
SELECT
    PersonID,
    MAX(CASE WHEN ContactMethod='Mobile' THEN ContactValue ELSE NULL END) AS Mobile,
    MAX(CASE WHEN ContactMethod='Email' THEN ContactValue ELSE NULL END) AS Email
FROM
    vwPersonMainContactDetails
GROUP BY
    PersonID
参考资料:


如果我们看一下Pivot的语法:

SELECT <non-pivoted column>,
    [first pivoted column] AS <column name>,
    [second pivoted column] AS <column name>,
    ...
    [last pivoted column] AS <column name>
FROM
    (<SELECT query that produces the data>)
    AS <alias for the source query>
PIVOT
(
    <aggregation function>(<column being aggregated>)
FOR
[<column that contains the values that will become column headers>]
    IN ( [first pivoted column], [second pivoted column],
    ... [last pivoted column])
) AS <alias for the pivot table>
<optional ORDER BY clause>;
SELECT,
[first pivoted column]作为,
[second pivoted column]作为,
...
[最后一个数据透视列]作为
从…起
()
作为


可读性的另一种方式:

SELECT PersonID, [Email], [Mobile]
FROM [TABLE]
PIVOT (MAX(ContactValue) FOR ContactMethod IN ([Email], [Mobile])) AS PIV

谢谢你们两位的帮助-非常感谢。好的-终于开始工作了。感谢你们两位的帮助——你们的两个解决方案都非常有效,所以我投票给了Arion,因为它提供了两个解决方案,同时也感谢Deepshikha的解释。早些时候(根据我的第一条评论)它不起作用,因为我在最初发布时忘记了列名包括匈牙利语前缀,lngPersonID、strContactMethod和strContactValue也是如此。因为我忘了提到它们,所以在您的解决方案中没有提到它们(很有趣!)。但一旦我添加了前缀,这两种解决方案都很好。这个故事的寓意是,在不顾一切地急于出门开会时,永远不要发问!大家好,谢谢你们的回复。然而,无论我尝试哪种方法,我都会得到相同的响应:Msg 207,16级,状态1,第7行无效列名“PersonID”。Msg 207,16级,状态1,第8行无效列名“ContactMethod”。Msg 207,16级,状态1,第9行无效列名“ContactValue”。(PS-也在努力格式化此评论-抱歉!)。我使用的是SQL Azure吗?我已经测试过了,所以它应该适合您的需要。有什么问题吗?