将行数据转换为 SQL 服务器中的列
Convert a row data to columns in SQL Server
我有一个场景,其中我有三列多行,我需要 select 它们在一行中。
下面我附上临时 table 场景。
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
我需要展示,
PersonID|Business|123456789|Cell|741852963|Other|987654321|Home|951357852
有人可以帮忙吗?
我必须将此结果与另一个 Select 查询合并,我该怎么做?
您可以使用条件聚合:
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
如果您有未知数量的 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
您可以使用此代码。可能对你有帮助。
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;
您可以像下面这样使用 PIVOT,
SELECT *
FROM #Temp
PIVOT(MAX(PhoneNumber)
FOR PhoneType IN ([Business],[Cell],[Other],[Home])) AS PVTTable
或者我想你想要像下面这样的东西,
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;
最后一个,
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
试试这个
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
我的解决方案是:
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)
我有一个场景,其中我有三列多行,我需要 select 它们在一行中。 下面我附上临时 table 场景。
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
我需要展示,
PersonID|Business|123456789|Cell|741852963|Other|987654321|Home|951357852
有人可以帮忙吗?
我必须将此结果与另一个 Select 查询合并,我该怎么做?
您可以使用条件聚合:
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
如果您有未知数量的 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
您可以使用此代码。可能对你有帮助。
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;
您可以像下面这样使用 PIVOT,
SELECT *
FROM #Temp
PIVOT(MAX(PhoneNumber)
FOR PhoneType IN ([Business],[Cell],[Other],[Home])) AS PVTTable
或者我想你想要像下面这样的东西,
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;
最后一个,
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
试试这个
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
我的解决方案是:
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)