我有一个表是这样的:SQL服务器:多发记录合并到同一行具有相同的ID
P_ID Lang
1001 EN
1001 German
期待的结果:
P_ID Lang1 Lang2
1001 EN German
我有一个表是这样的:SQL服务器:多发记录合并到同一行具有相同的ID
P_ID Lang
1001 EN
1001 German
期待的结果:
P_ID Lang1 Lang2
1001 EN German
我只是不得不做PIVOT这样的,所以这里是我的代码修改您的具体情况:
SELECT * FROM
(
SELECT P_ID,
Lang,
NumberedLang = 'Lang' + CAST(ROW_NUMBER() OVER
(PARTITION BY P_ID ORDER BY Lang) AS NVARCHAR(100))
FROM YourTableName
) AS OrderLangs
PIVOT (MAX(Lang) FOR NumberedLang IN (Lang1, Lang2)) AS PivotedLangs
这里是一个SQL Fiddle告诉你,它的工作原理。
如果您不想指定所有不同的NumberedLang
值,那么您将不得不在使用基于文本的SQL中执行所有代码时使用“动态”枢轴。尽管由于没有可用的查询计划,它们可能效率很低。
现在我只有5种不同的语言,但在后续阶段使用动态枢轴将非常有用。谢谢! – Coconuts
这是一个有点难看,但你可以做这样的事情:
select p_id
, max(case when langNum=1 then lang else null end) as Lang1
, max(case when langNum=2 then lang else null end) as Lang2
, max(case when langNum=3 then lang else null end) as Lang3
, max(case when langNum=4 then lang else null end) as Lang4
, max(case when langNum=5 then lang else null end) as Lang5
-- ...
from (
select p_id
, lang
-- Get a number for each row, starting from 1 for each p_id:
, row_number() over (partition by p_id order by lang) as LangNum
from theTable
) as x
group by p_id
Thx为您的答复!有用! – Coconuts
相同的这个问题,它有答案:http://stackoverflow.com/questions/17076089/convert-row-data-to-column-in-sql-server – dhidy