【发布时间】:2014-02-27 09:31:05
【问题描述】:
我有一张这样的表:
P_ID Lang
1001 EN
1001 German
预期结果:
P_ID Lang1 Lang2
1001 EN German
【问题讨论】:
-
和这个问题一样,答案是:stackoverflow.com/questions/17076089/…
标签: sql-server
我有一张这样的表:
P_ID Lang
1001 EN
1001 German
预期结果:
P_ID Lang1 Lang2
1001 EN German
【问题讨论】:
标签: sql-server
我只是必须像这样处理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 中执行所有代码。由于没有可用的查询计划,它们的效率可能非常低。
【讨论】:
这有点难看,但你可以这样做:
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
【讨论】: