Как закодировать Microsoft Excel функцию «Shift Cells Up» в SQL - PullRequest
0 голосов
/ 30 марта 2010

Возьмите простой стол, как показано ниже:

Column Headings: || Agent's Name || Time Logged In || Center ||  
Row 1: Andrew  || 12:30 PM || Home Base  
Row 2: Jeff || 7:00 AM || Virtual Base  
Row 3: Ryan || 6:30 PM || Test Base

Теперь допустим, что одна ячейка удалена, поэтому таблица теперь выглядит следующим образом:

Column Headings: || Agent's Name || Time Logged In || Center ||  
Row 1: Andrew  || 12:30 PM ||   
Row 2: Jeff || 7:00 AM || Virtual Base  
Row 3: Ryan || 6:30 PM || Test Base

Обратите внимание, что "Домашняя база" отсутствует. Теперь в Excel вы можете удалить ячейку и сдвинуть остальные, чтобы готовый продукт выглядел так, как показано ниже:

Column Headings: || Agent's Name || Time Logged In || Center ||  
Row 1: Andrew  || 12:30 PM || Virtual Base   
Row 2: Jeff || 7:00 AM || Test Base  
Row 3: Ryan || 6:30 PM || 

И вы можете видеть, что у нас осталось пустое поле в последнем ряду.

Как мне написать код процедуры смещения ячеек в SQL?

Я боролся с этой проблемой уже несколько недель! Спасибо!

Ответы [ 3 ]

6 голосов
/ 30 марта 2010

Вы не можете - таблицы SQL не являются листами Excel - у них просто нет такой структуры.Независимо от того, как сильно вы стараетесь - вы не сможете сделать что-то подобное.Это просто принципиально отличается.

Таблицы SQL Server имеют строки и столбцы - конечно - но у них нет подразумеваемого порядка или чего-либо еще.Вы не можете «сдвинуть» строку вверх - нет «вверх» как таковой - все зависит от вашего заказа.

Это хуже, чем сравнивать яблоки с апельсинами - это как сравнивать яблоки с гранитными блоками - это просто нето же самое - не тратьте свое время на попытки сделать то же самое.

3 голосов
/ 30 марта 2010

Один из многих вариантов - использовать outer apply для извлечения центра из следующего ряда:

declare @t table (name varchar(50), login time, center varchar(50))

insert into @t (name, login, center)
select 'Andrew', '12:30 PM', 'Home Base'
union all select 'Jeff', '7:00 AM', 'Virtual Base'
union all select 'Ryan', '6:30 PM', 'Test Base'

update t1
set t1.center = t3.center
from @t t1
outer apply (
    select top 1 t2.center
    from @t t2
    where t2.name > t1.name
    order by t2.name
) t3

select * from @t

Вы должны указать порядок (пример заказов на имя.)

0 голосов
/ 30 марта 2010

Если у вас есть два набора, и вы просто хотите назначить один из каждого во втором наборе элементам из первого набора, «используя их вверх», самое простое - использовать ROW_NUMBER () для обоих наборов и выполнить ВЛЕВО ПРИСОЕДИНЯЙТЕСЬ к столбцу ROW_NUMBER () с первого по второй набор, присваивая каждой строке следующий доступный элемент:

WITH set1 AS (
    SELECT *, ROW_NUMBER() (OVER ORDER BY set1.sortorder /* choice of order by is obviously important */) AS ROWNUM
    FROM set1
)
,set2 AS (
    SELECT *, ROW_NUMBER() (OVER ORDER BY set2.sortorder /* choice of order by is obviously important */) AS ROWNUM
    FROM set2
)
SELECT *
FROM set1
LEFT JOIN set2
    ON set1.keys = set2.keys -- if there are any keys
    AND set1.ROW_NUM = set2.ROW_NUM
...