【问题标题】:SQL Server: mutiple records merge to a same row with the same ID [duplicate]SQL Server:多条记录合并到具有相同ID的同一行[重复]
【发布时间】:2014-02-27 09:31:05
【问题描述】:

我有一张这样的表:

P_ID    Lang   
1001    EN
1001    German 

预期结果:

P_ID Lang1  Lang2  
1001  EN     German

【问题讨论】:

标签: sql-server


【解决方案1】:

只是必须像这样处理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 种不同的语言,但是稍后在下一阶段使用动态枢轴将非常有用。谢谢!
【解决方案2】:

这有点难看,但你可以这样做:

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

【讨论】:

  • 感谢您的回复!它有效!
猜你喜欢
  • 1970-01-01
  • 2017-05-05
  • 2016-11-03
  • 1970-01-01
  • 2017-10-19
  • 1970-01-01
  • 2016-05-12
  • 1970-01-01
相关资源
最近更新 更多