2015-01-09 3 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 
Смежные вопросы