У меня есть таблица со столбцами USERID и COUNTRYNAMEПреобразование строк в столбцы
Теперь я хочу получить запись таким образом
[UserId] [ContryName1] [ContryName2] [ContryName3].........
У меня есть таблица со столбцами USERID и COUNTRYNAMEПреобразование строк в столбцы
Теперь я хочу получить запись таким образом
[UserId] [ContryName1] [ContryName2] [ContryName3].........
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'
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
Я использую sql sever 2012. –
Использование '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) –