[英]Convert a row data to columns in SQL Server
I have a scenario in which I have three columns with multiple rows, I need to select them in single row. 我有一个场景,其中我有三列多行,我需要在单行中选择它们。 Below I am attaching temporary table scenario. 下面我附上临时表格场景。
CREATE TABLE #Temp
(
PersonID INT ,
PhoneType VARCHAR(20) ,
PhoneNumber VARCHAR(20)
)
INSERT INTO #Temp
( PersonID ,
PhoneType ,
PhoneNumber
)
SELECT 1212 ,
'Business' ,
'123456789'
UNION ALL
SELECT 1212 ,
'Cell' ,
'741852963'
UNION ALL
SELECT 1212 ,
'Other' ,
'987654321'
UNION ALL
SELECT 1212 ,
'Home' ,
'951357852'
SELECT *
FROM #Temp
DROP TABLE #Temp
I need to Display, 我需要显示,
PersonID|Business|123456789|Cell|741852963|Other|987654321|Home|951357852
Can anybody help? 有人可以帮忙吗?
I have to combine this result with another Select Query,How may I do? 我必须将此结果与另一个Select Query相结合,我该怎么办?
You can use PIVOT like below, 您可以像下面这样使用PIVOT,
SELECT *
FROM #Temp
PIVOT(MAX(PhoneNumber)
FOR PhoneType IN ([Business],[Cell],[Other],[Home])) AS PVTTable
OR I think you want something like below, 或者我认为你想要下面的东西,
SELECT PersonID = STUFF((SELECT PhoneType + ' | ' + PhoneNumber + ' | '
FROM #Temp
ORDER BY PersonID
FOR XML PATH('')), 1, 0, '')
FROM #Temp AS x
GROUP BY PersonID, PhoneType
ORDER BY PersonID;
Last one, 最后一个,
DECLARE @MainColumn AS NVARCHAR(MAX) = ''
SET @MainColumn = (SELECT PersonID = STUFF((SELECT PhoneType + ' | ' + PhoneNumber + ' | '
FROM #Temp
ORDER BY PersonID
FOR XML PATH('')), 1, 0, '')
FROM #Temp AS x
GROUP BY PersonID)
SELECT 'PersonID | ' + @MainColumn AS FinalResult
You can use conditional aggregation: 您可以使用条件聚合:
SELECT
PersonID,
Business = MAX(CASE WHEN PhoneType = 'Business' THEN PhoneNumber END),
Cell = MAX(CASE WHEN PhoneType = 'Cell' THEN PhoneNumber END),
Other = MAX(CASE WHEN PhoneType = 'Other' THEN PhoneNumber END),
Home = MAX(CASE WHEN PhoneType = 'Home' THEN PhoneNumber END)
FROM #Temp
GROUP BY PersonID
If you have unknown number of PhoneType
s, do a dynamic crosstab: 如果您有未知数量的PhoneType
,请执行动态交叉表:
DECLARE @sql NVARCHAR(MAX) = ''
SELECT @sql =
'SELECT
PersonID' + CHAR(10)
SELECT @sql = @sql +
' , MAX(CASE WHEN PhoneType = ''' + PhoneType + ''' THEN PhoneNumber END) AS' + QUOTENAME(PhoneType) + CHAR(10)
FROM (SELECT DISTINCT PhoneType FROM #Temp) t
SELECT @sql = @sql +
'FROM #Temp
GROUP BY PersonID'
EXEC sp_executesql @sql
You can use this code. 您可以使用此代码。 It may be Help you. 它可能会帮助你。
DECLARE @cols AS NVARCHAR(MAX),@query AS NVARCHAR(MAX)
SELECT @cols = STUFF((SELECT ',' + QUOTENAME(PhoneType)
from #Temp
group by PhoneType, PersonID
order by PersonID
FOR XML PATH('')), 1, 1, '')
SET @query = N'SELECT ' + @cols + N' from
(
select *
from #Temp
) x
pivot
(
max(PhoneNumber)
for PhoneType in (' + @cols + N')
) p'
EXEC SP_EXECUTESQL @QUERY;
Try this 尝试这个
DECLARE @String VARCHAR(MAX) --To store the result
--Make the result by appending each rows
SELECT @String = ISNULL(@String,'PersonID') + ' | '+ PhoneType + ' | ' + PhoneNumber
FROM #Temp
--return the string
SELECT @String
My solution would be: 我的解决方案是:
SELECT outerTbl.MyDisplayValue
FROM
(
SELECT DISTINCT CAST(PersonID AS varchar(MAX)) + Concatenated.Contacts
FROM #Temp AS tbl
OUTER APPLY
(
SELECT '|' + innerTbl.PhoneType + '|' + innerTbl.PhoneNumber
FROM #Temp AS innerTbl
WHERE innerTbl.PersonID=tbl.PersonID
FOR XML PATH('')
) AS Concatenated(Contacts)
FOR XML PATH('')
) AS outerTbl(MyDisplayValue)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.