简体   繁体   English

将行数据转换为SQL Server中的列

[英]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: 您可以使用条件聚合:

SQL Fiddle SQL小提琴

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 ,请执行动态交叉表:

SQL Fiddle SQL小提琴

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM