2015-09-29 3 views
0

У меня есть таблица со столбцами USERID и COUNTRYNAMEПреобразование строк в столбцы

Теперь я хочу получить запись таким образом

[UserId] [ContryName1] [ContryName2] [ContryName3]......... 
+1

Использование 'PIVOT' Я просто написать [** ответ **] (http://stackoverflow.com/questions/32849539/sql-server-populate -a-table-based-on-another-table-with-a-substring-as-column-na/32849645 # 32849645) очень похоже на этот случай. В моем случае я знаю имя столбцов перед рукой, если вам не понадобится [** динамический свод **] (http://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query) –

ответ

2

Fiddle здесь: http://sqlfiddle.com/#!6/cd6f1/1

DECLARE @SQL AS NVARCHAR(MAX) 
WITH CTE AS 
(
SELECT USERID,COUNTRYNAME,ROW_NUMBER() OVER(PARTITION BY USERID ORDER BY COUNTRYNAME) AS RN 
FROM CNTRIES 
) 

SELECT @SQL = 'WITH CTE1 AS 
(
SELECT USERID,COUNTRYNAME,ROW_NUMBER() OVER(PARTITION BY USERID ORDER BY COUNTRYNAME) AS RN 
FROM CNTRIES 
) 
SELECT * 
FROM 
(SELECT USERID,COUNTRYNAME,RN FROM CTE1)C 
PIVOT (MAX(COUNTRYNAME) FOR RN IN (['+STUFF((SELECT '],['+CAST(RN AS VARCHAR(100)) 
              FROM CTE 
              GROUP BY RN 
              FOR XML PATH('')),1,3,'')+'])) AS PIVOTT' 
0

PIVOT является лучшим вариантом, если ваша версия - SQL Server 2005 или выше, но вы не указываете версию и пытаетесь использовать PIVOT без естественной совокупности, которую трудно понять для некоторых. Если ваша версия ниже 2005 года, у вас больше проблем. В противном случае вам нужно будет присоединиться к таблице непосредственно, чтобы дать вам тот же результат. Вы можете использовать функцию ранжирования, чтобы сделать ее немного легче. Что-то вроде этого, хотя и неэффективно, даст аналогичные результаты.

/* 
    IF OBJECT_ID('Countries','U') IS NOT NULL 
     DROP TABLE Countries 

    CREATE TABLE Countries 
    (
      UserID INT 
     , CountryName VARCHAR(255) 
    ) 

    INSERT Countries 
    VALUES (1, 'India') 
     , (1, 'UK') 
     , (2, 'USA') 
     , (2, 'India') 
     , (2, 'Canada') 
    */ 


    SELECT DISTINCT x.UserID, x.CountryName Country1, y.CountryName Country2, z.CountryName Country3 
    FROM Countries c 
     LEFT JOIN 
     (
      SELECT *, RANK() OVER(PARTITION BY UserID ORDER BY UserID, CountryName) AS UserRank 
      FROM Countries 
     )x ON x.UserID = c.UserID AND x.UserRank=1 
     LEFT JOIN 
     (
      SELECT *, RANK() OVER(PARTITION BY UserID ORDER BY UserID, CountryName) AS UserRank 
      FROM Countries 
     )y ON y.UserID = c.UserID AND y.UserRank=2 
     LEFT JOIN 
     (
      SELECT *, RANK() OVER(PARTITION BY UserID ORDER BY UserID, CountryName) AS UserRank 
      FROM Countries 
     )z ON z.UserID = c.UserID AND z.UserRank=3 
+0

Я использую sql sever 2012. –

Смежные вопросы