2015-01-09 122 views
0

这是一个面试问题。如何使用SQL将列值滑动到右侧或左侧?

如果我有这样的一个表:

ID  FirstName  LastName 
--  ---------  -------- 
1   Aaron   Aames 
2   Malcolm   Middle 
3   Zamon   Zorr 

我怎样才能输出,看起来像这样?

  Aaron   Aames 
      Aames   Malcolm 
      Malcolm   Middle 
      Middle   Zamon 
      Zamon   Zorr 

注意:如果您需要特定的方言来执行此操作,请使用T-SQL。

回答

2

这是使用自连接的另一种方式。

CREATE TABLE temp (ID INT IDENTITY, FirstName VARCHAR(25), LastName VARCHAR(25)); 

INSERT INTO temp VALUES 
(N'Aaron', N'Aames'), 
(N'Malcolm', N'Middle'), 
(N'Zamon', N'Zorr'); 

WITH names(ID, Name, ColNum) AS(
    SELECT 
     ID, FirstName, 1 
    FROM temp 
    UNION ALL 
    SELECT 
     ID, LastName, 2 
    FROM temp 
), 
numbered AS(
    SELECT 
     rn = ROW_NUMBER() OVER(ORDER BY ID, ColNum), 
     Name 
    FROM names 
) 
SELECT 
    n.Name AS Name1, n2.Name AS Name2 
FROM numbered n 
INNER JOIN numbered n2 
    ON n.rn = n2.rn - 1 

DROP TABLE temp 

http://sqlfiddle.com/#!3/d91c4/2

1

你的名声真的很高,所以这不仅仅是“他们在采访时问我”的一种问题。

有几种方法。我认为我会采取的是union all。认识到每隔一行都来自表格。其余的是从一行加入到另一行。所以,这表明:

select firstname, lastname 
from likethis t 
union all 
select t.lastname, lead(t.firstname) over (order by id) 
from likethis t 

唉,这给你,而不是五六排,使最后一个需要被过滤掉:

select firstname, lastname 
from (select firstname, lastname 
     from likethis t 
     union all 
     select t.lastname, lead(t.firstname) over (order by id) 
     from likethis t 
    ) t 
where lastname is not null 
order by firstname; 

注:我不能确定是否排序标准按字母顺序或通过ID;这些解决方案假定它是按字母顺序的

第二个注意:我猜这不是他们想到的解决方案。他们可能正在寻找一个自我加入。但为什么打扰lead()为你做的工作。

+0

*'铅'不是一个公认的内置函数它的名称* --http://sqlfiddle.com/#!3/b1ac3/1 –

+0

它始于SQL Server 2012.面试问题不应该是关于两个主要版本过时的软件。 –

+0

SqlFiddle此刻拒绝运行SQL Server 2012。 –

0

我认为它可以解决这样:据

SELECT 
    t.LastName AS FirstName, t2.FirstName AS LastName 
FROM  
    t 
    INNER JOIN t as t2 ON t2.ID - 1 = t.ID 
UNION 
SELECT 
    t3.FirstName, t3.LastName 
FROM t AS t3 

,因为我已经核对无误它应该给最终结果集方式如下:

Aaron  Aames  <= originates from t3: where t3.ID = 1 
Aames  Malcolm  <= originates from (t1, t2) Join: where t2.ID = 2 and t.ID = 1 
Malcolm Middle  <= originates from t3: where t3.ID = 2 
Middle Zamon  <= originates from (t1, t2) Join: where t2.ID = 3 and t.ID = 2 
Zamon  Zorr  <= originates from t3: where t3.ID = 3 
相关问题