如何在sql中以列方式获取行?

时间:2011-12-16 11:07:07

标签: mysql sql sql-server sql-server-2008 sql-server-2005

我的表中有一条记录,如

memberId    PersonId    Year
4057        1787         2
4502        1787         3

我想要一个像这样的查询的结果

memberId1   MemberId2   PersonId
4057        4502        1787

如何编写查询??

4 个答案:

答案 0 :(得分:2)

请勿在查询中执行此操作,请在应用程序层中执行此操作。

答案 1 :(得分:1)

不要在SQL中执行此操作。充其量你可以尝试:

SELECT table1.memberId memberId1, table2.memberId MemberId2, PersonId
FROM table table1 JOIN table table2 USING (PersonId)

但是,如果一个人拥有超过2个会员,那么它将无法满足您的期望。 (它将返回所有可能的组合。)

答案 2 :(得分:0)

下面是一个如何在SQL中直接执行此操作的示例。请注意,有足够的优化空间,但这个版本应该相当快,特别是如果你有PersonID和年份的索引。

SELECT DISTINCT PersonID,
                memberId1 = Convert(int, NULL),
                memberId2 = Convert(int, NULL)
  INTO #result
  FROM myTable
 WHERE Year IN (2 , 3)

CREATE UNIQUE CLUSTERED INDEX uq0_result ON #result (PersonID) 

UPDATE #result 
   SET memberId1 = t.memberId
  FROM #result upd
  JOIN myTable t
    ON t.PersionId = upd.PersonID
   AND t.Year = 2

UPDATE #result 
   SET memberId2 = t.memberId
  FROM #result upd
  JOIN myTable t
    ON t.PersionId = upd.PersonID
   AND t.Year = 3

SELECT * FROM #result 

答案 3 :(得分:0)

如果你想要每个person_id的所有成员ID,你可以使用[for xml path]语句(强大的功能) 将所有memberId连接成一个字符串

select distinct PersonId
       , (select ' '+cast(t0.MemberId as varchar)
          from table t0 
          where t0.PersonId=t1.PersonId
          for xml path('')
         ) [Member Ids]
from table t1

导致:

PersonId   Members Ids
1787      ' 4057 4502'

如果你真的需要单独的列,无限数量的memberIds,请考虑使用 一个PIVOT表,但使用起来要复杂得多