如何从上面的行中选择信息?

时间:2012-01-20 15:07:47

标签: sql sql-server tsql cursor sql-server-2008-r2

我想在我的表中添加一列,如下所示: 这只是表格结构的一个例子,实际表格超过10,000行。

No_   Name       Account_Type    Subgroup     (New_Column)
100   Sales      3               
200   Underwear  0               250          *100
300   Bikes      0               250          *100
400   Profit     3                             
500   Cash       0               450          *400

因此,每次'子组'中都有值时,我希望(New_Column)从上面的行中获取值[No_]

No_   Name       Account_Type    Subgroup     (New_Column)
100   Sales      3               
150   TotalSales 3
200   Underwear  0               250          *150
300   Bikes      0               250          *150
400   Profit     3                             
500   Cash       0               450          *400

有些情况下表格如上所述,其中两个“标题”在上面。在这种情况下,我也希望在这种情况下第一行(150)。

这是游标的情况还是你推荐什么?

数据按No _

排序

- 编辑 -

从第一行开始,然后遍历整个表: 有没有办法可以存储[No_]的值,其中[子组]是''? 然后在下面的每一行的(New_Column)中插入此[No_]值,在[Subgroup]行中具有值。 当[子组]行为空时,进程将继续运行,在(New_Column)中插入下一个[No_]值,即如果下一行在[子组]中有值

这是我想要做的更好的形象: enter image description here

5 个答案:

答案 0 :(得分:3)

SQL Server 2012建议使用窗口偏移功能。 在这种情况下:LAG

这样的事情:

SELECT [No_]
  ,[Name]
  ,[Account_Type]
  ,[Subgroup]
  ,LAG([No_]) OVER(PARTITION BY [Subgroup]
ORDER BY [No_]) as [PrevValue]
FROM table

以下是MS的一个例子: http://technet.microsoft.com/en-us/library/hh231256.aspx

答案 1 :(得分:2)

ROW_NUMBER函数将允许您找出该行的编号,但由于它是一个窗口函数,您必须使用公用表表达式(CTE)将表连接到自身。

WITH cte AS
(
    SELECT [No_], Name, Account_Type, Subgroup, [Row] = ROW_NUMBER() OVER (ORDER BY [No_])
    FROM table
)
SELECT t1.*, t2.[No_]
FROM cte t1 
LEFT JOIN cte t2 ON t1.Row = t2.Row - 1

希望这有帮助。

答案 2 :(得分:0)

下一个查询将返回行的名称而不是行本身,即Sales,Underwear,Bikes的Sales;和利润,现金利润:

select ISNULL(t2.Name, t1.Name)
from table t1
left join table t2 on t1.NewColumn = t2.No

答案 3 :(得分:0)

因此,在SQL Server 2008中,我创建了包含3个值的测试表:

create table #ttable
(
    id int primary key identity,
    number int,
    number_prev int
)
Go
Insert Into #ttable (number) 
Output inserted.id
Values (10), (20), (30);

在表格中插入,你需要的东西(至少如果理解正确)如下所示:

declare @new_value int;
set @new_value = 13; -- NEW value
Insert Into #ttable (number, number_prev)
Values (@new_value, 
    (Select Max(number) From #ttable t Where t.number < @new_value)) 

[此部分已添加]并且要使用子组 - 只需修改内部选择以过滤掉它:

Select Max(number) From #ttable t 
Where t.number < @new_value And Subgroup != @Subgroup

答案 4 :(得分:0)

SELECT
      No_
    , Name 
    , Account_Type 
    , Subgroup 
    , ( SELECT MAX(above.No_) 
        FROM TableX AS above
        WHERE above.No_ < a.No_
          AND above.Account_Type = 3
          AND a.Account_Type <> 3
      ) AS NewColumn
FROM
      TableX AS a