我想在我的表中添加一列,如下所示: 这只是表格结构的一个例子,实际表格超过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_]值,即如果下一行在[子组]中有值
这是我想要做的更好的形象:
答案 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