如何在SQL中编写Microsoft Excel“Shift Cells Up”功能

时间:2010-03-29 21:08:22

标签: sql tsql excel cell

如下所示:

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

请注意,缺少“Home 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 个答案:

答案 0 :(得分:6)

你不能 - SQL表不是Excel表 - 它们只是没有那种结构。无论你怎么努力 - 你都无法做那样的事情。这只是根本不同。

SQL Server表有行和列 - 当然 - 但它们没有隐含的顺序或任何东西。你不能“改变”一行 - 本身没有“向上” - 这一切都取决于你的订购。

比将苹果与橙子相比更糟糕 - 这就像比较苹果和花岗岩块 - 它只是不一样 - 不要浪费你的时间试图让它变得一样。

答案 1 :(得分:3)

许多选项之一是使用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

您必须指定排序(名称上的示例订单。)

答案 2 :(得分:0)

如果你有两套,你只想将第二组中的每一组分配给第一组中的项目,“使用它们”,最简单的方法是在两组上使用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