sql 逐级汇总示例(循环逐级累计法)
sql 递归累加
sql 递归累加
在SQL中,你可以使用递归查询来实现累加操作。递归查询允许你在一个查询中引用自己,以便根据给定的条件逐级深入数据。
下面是一个示例,演示如何使用递归查询进行累加操作:
sql复制代码
WITH RecursiveSum (id, value, total) AS (
SELECT id, value, value AS total
FROM your_table
WHERE id = 1-- 起始ID
UNION ALL
SELECT t.id, t.value, t.value + r.total
FROM your_table t
INNER JOIN RecursiveSum r ON t.id = r.id + 1-- 递归关联条件
)
SELECT id, value, total
FROM RecursiveSum;
在上面的示例中,我们使用了递归查询RecursiveSum。在第一个查询中,我们选择起始ID为1的行,并将总和初始化为该行的值。然后,在第二个查询中,我们将递归地关联原始表your_table和RecursiveSum,并使用id列进行递增关联。在每个递归步骤中,我们将当前行的值添加到总和中。
请注意,上述示例中的表名和列名需要根据你自己的数据结构进行调整。
sql循环相加的函数 -回复
sql循环相加的函数-回复
如何使用SQL 编写循环相加的函数
在SQL 中,可以使用循环相加的函数来实现对指定范围的数值进行累积相加的操作。在本文中,我们将一步一步地解释如何编写一个循环相加的函数,该函数可以接受两个参数,并返回一个数值,该数值是从第一个参数累加到第二个参数范围内所有数值的总和。
首先,我们需要创建一个函数来实现循环相加的逻辑。在大多数SQL 数据库中,我们可以使用PL/SQL 或者T-SQL 编写函数。以下是一个使用T-SQL 的示例:
sql
CREATE FUNCTION SumRange(start INT, end INT)
RETURNS INT
AS
BEGIN
DECLARE sum INT = 0;
WHILE start <= end
BEGIN
SET sum += start;
SET start += 1;
RETURN sum;
END
在这个例子中,我们创建了一个名为"SumRange" 的函数,它接受两个INT 类型的参数:start 和end。函数的返回类型也是INT。
函数的逻辑非常简单。我们首先定义了一个变量sum,用于存储累积的结果。然后使用WHILE 循环,不断重复以下操作:将start 的值加到sum 上,然后将start 的值增加1。循环将一直执行,直到start 的值大于end 的值。最后,我们将累加结果sum 返回。
接下来,我们可以测试这个函数,看看它是否能正常工作。我们可以在一个SQL 查询中调用这个函数,并查看返回的结果:
sql
SELECT dbo.SumRange(1, 10) AS Result;
sql 逐行累计求和方法
sql 逐行累计求和方法
一、背景介绍
在进行数据处理的时候,我们经常需要对某一列数据进行累加求和。而在SQL中,逐行累计求和是一种非常常见的操作。
二、基本语法
在SQL中,实现逐行累计求和的语法如下:
SELECT SUM(column_name) OVER (ORDER BY
order_column_name) AS cumulative_sum FROM table_name;
其中,SUM表示对某一列数据进行求和操作;OVER表示对整个表格进行操作;ORDER BY表示按照某一列的顺序进行排序;AS用于给结果命名。
三、具体实现步骤
1. 创建测试表格
首先,我们需要创建一个测试表格来演示逐行累计求和的方法。可以使用以下SQL语句来创建一个名为test_table的表格:
CREATE TABLE test_table (id INT, value INT);
2. 插入测试数据
接着,我们需要往test_table中插入一些测试数据。可以使用以下SQL语句来插入10条随机生成的数据:
INSERT INTO test_table (id, value) VALUES (1, 10);
INSERT INTO test_table (id, value) VALUES (2, 20);
INSERT INTO test_table (id, value) VALUES (3, 30);
INSERT INTO test_table (id, value) VALUES (4, 40);
INSERT INTO test_table (id, value) VALUES (5, 50);
SQL汇总和分组数据
SQL汇总和分组数据
SQL是一种用于管理和操作关系型数据库的语言,它提供了各种功能
和命令,用于对数据进行查询、插入、更新和删除等操作。汇总和分组数
据是SQL中常用的功能之一,可以用于对数据进行统计和分析。
在SQL中,可以使用如下几个关键字来实现汇总和分组数据的操作:
1.SELECT:用于查询数据,可以通过SELECT命令选择相应的列或者
使用通配符"*"选择所有列。
2.FROM:用于指定查询的数据源,即要查询的表或者视图的名称。
3.GROUPBY:用于对数据进行分组。可以按照一个或多个列来进行分组,分组后的数据将会根据指定的列值进行分组。
4.HAVING:用于对分组后的数据进行过滤。可以使用逻辑运算符和聚
合函数对分组后的数据进行筛选。
5.ORDERBY:用于对查询结果进行排序,可以按照一个或多个列进行
排序。
下面是一个示例,展示如何使用SQL对数据进行汇总和分组:
假设有一个存储销售订单信息的订单表,其中包含以下字段:订单号、客户名、订单金额和订单日期。现在需要查询每个客户的订单总金额,并
按照总金额降序排列。
```sql
SELECT客户名,SUM(订单金额)AS总金额
FROM订单表
GROUPBY客户名
ORDERBY总金额DESC;
```
上述SQL语句中,我们使用了SUM函数来计算每个客户的订单总金额,并使用GROUPBY将结果按照客户名进行分组。最后,使用ORDERBY将结果
按照总金额降序排序。
除了SUM函数外,还可以使用其他聚合函数(如COUNT、AVG、MIN和MAX)对数据进行汇总和分组。同时,还可以在HAVING子句中使用逻辑运
sql循环相加的函数 -回复
sql循环相加的函数-回复
SQL是一种用于管理和操作关系数据库的编程语言。它具有强大的功能,可用于查询、插入、更新和删除数据库中的数据。在SQL中,循环相加是一种常见的需求,特别是在处理大量数据时。本文将介绍如何使用SQL 编写循环相加的函数。
首先,我们需要理解SQL中的循环和聚合函数的概念。循环是执行某个操作多次的机制,而聚合函数用于计算一组值的总和、平均值、最大值或最小值。在循环相加的情况下,我们将使用循环来遍历数据并将它们相加,然后使用聚合函数计算总和。
在SQL中,一般没有显式的循环语句,而是通过使用递归、游标或循环控制语句来模拟循环。在本文中,我们将使用递归实现循环相加的函数。递归是一种自我调用的机制,它将一个问题分解为较小的子问题,直到达到递归的终止条件。
首先,我们创建一个表格来存储要相加的数据。假设我们有一个名为"numbers"的表格,其中包含一个名为"value"的列,存储了要相加的数字。可以使用以下SQL语句创建表格:
CREATE TABLE numbers (
value INT
);
接下来,我们向表格中插入一些数据,以便进行测试。可以使用以下SQL 语句插入数据:
INSERT INTO numbers (value)
VALUES (1), (2), (3), (4), (5);
现在,我们可以开始编写循环相加的函数。首先,我们需要定义一个递归函数来遍历数据并进行相加。以下是一个使用递归实现循环相加的函数的示例:
CREATE FUNCTION recursive_sum(n INT)
SQL集合运算参考及案例(二):树形节点数量逐级累计汇总
SQL集合运算参考及案例(⼆):树形节点数量逐级累计汇总问题描述:
我们经常遇到这样⼀个问题,类似于⾯对⼀个树形结构的物料数据,需要将库存中每⼀种物料数量汇总到物料上展⽰出来;或者说组织机构是⼀棵树,我们需要统计每⼀个节点上的⼈员数量(含下级节点的累计数量)。在此将解决的核⼼部分抽取出来。
因为是树形结构我们需要⽤到CTE的递归定义。CTE是⼀种⼗分优雅的存在,CTE所带来最⼤的好处是代码可读性的提升,这是良好代码的必须品质之⼀。使⽤递归CTE可以更加轻松愉快的⽤优雅简洁的⽅式实现复杂的查询。更重要的是标准的SQL是⼯作在DB关系运算引擎上,⽽游标等⾯向过程的代码则不是,这会体现在运⾏效率上。
在定义和使⽤递归CTE时应注意:递归 CTE 定义⾄少必须包含两个 CTE 查询定义,⼀个定位点成员和⼀个递归成员。可以定义多个定位点成员和递归成员;但必须将所有定位点成员查询定义置于第⼀个递归成员定义之前。所有 CTE 查询定义都是定位点成员,但它们引⽤CTE 本⾝时除外。
注:最后⼀列是我们想要的值
Id ParentId Qty Qty_Sum
10 115
21211
3133
424 9
54 55
--- 构造测试数据的脚本
CREATE TABLE tMaterial
(
Id INT PRIMARY KEY
, ParentId INT
, Qty INT
, Qty_Sum INT
)
INSERT INTO tMaterial
SELECT1, 0, 1, 0
UNION ALL SELECT2, 1, 2, 0
实现数据分类汇总的SQL语句
实现数据分类汇总的SQL语句
现有表Test,内容如下: ID Catalog Num 1 A 3 1 B 52 A 8 2 B 2 现在想按ID查询出这种结果: -------------------- 1 A 31 B 5 汇总小计: 82 A 8 2 B 2 汇总小计: 10 问:该如何实现?
在生成包含小计和合计的报表时,ROLLUP 运算符很有用。ROLLUP 运算符生成的结果集类似于 CUBE 运算符所生成的结果集。========================CUBE 运算符生成的结果集是多维数据集。多维数据集是事实数据的扩展,事实数据即记录个别事件的数据。扩展建立在用户打算分析的列上。这些列被称为维。多维数据集是一个结果集,其中包含了各维度的所有可能组合的交叉表格。 CUBE 运算符在 SELECT 语句的 GROUP BY 子句中指定。该语句的选择列表应包含维度列和聚合函数表达式。GROUP BY 应指定维度列和关键字 WITH CUBE。结果集将包含维度列中各值的所有可能组合,以及与这些维度值组合相匹配的基础行中的聚合值。=========================CUBE 和 ROLLUP 之间的区别在于: CUBE 生成的结果集显示了所选列中值的所有组合的聚合。 ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合。
The ROLLUP operator is useful in generating reports that contain subtotals and totals. The ROLLUP operator generates a result set that is similar to the result sets generated by the CUBE operator.
sql 分类汇总
SQL SERVER的分类汇总
SQL SERVER中使用GROUP BY对数据进行分类汇总,我们也可以使用WITH ROLLUP 和WITH CUBE配合GROUP BY进行“增强”了的分类汇总,那么他们两个是如何增强GROUP BY的汇总能力的呢?
一.功能增强
1.使用WITH ROLLUP
用下面的例子说明,GROUP使用了3个分组字段:GROUP BY A, B, C WITH ROLLUP 就相当于
GROUP BY A, B, C UNION ALL
GROUP BY A, B UNION ALL
GROUP BY A UNION ALL
GROUP BY NULL
2.使用WITH CUBE
用下面的例子说明,GROUP使用了3个分组字段:GROUP BY A, B, C WITH CUBE 就相当于
GROUP BY A, B, C UNION ALL
GROUP BY A, B UNION ALL
GROUP BY A, C UNION ALL
GROUP BY B, C UNION ALL
GROUP BY A UNION ALL
GROUP BY B UNION ALL
GROUP BY C UNION ALL
GROUP BY NULL
二.说明:
1.WITH ROLLUP和CUBE可以使用HAVING和GROUPING对产生的汇总行进行再次过滤。
2.GROUP BY A, B, C WITH ROLLUP/CUBE会将生成的汇总排序号,而GROUP BY/UNION ALL 却没有,只有手工ORDER BY排序了。
sql 逐行累计求和方法
SQL逐行累计求和方法
1. 引言
在数据分析和处理过程中,经常需要对某个字段进行逐行累计求和操作,以获得更加详细和准确的结果。SQL是一种用于管理和处理关系型数据库的语言,具备强大的数据处理能力。本文将介绍在SQL中实现逐行累计求和的方法。
2. 前提条件
在开始介绍具体方法之前,需要明确以下前提条件: - 已存在一个包含待求和字段的表格 - 待求和字段的数据类型为数值类型(如整数、浮点数等) - 表格中存在用于排序的字段(如ID、日期等)
3. 方法一:使用子查询和JOIN操作
以下是使用子查询和JOIN操作实现逐行累计求和的方法:
3.1 创建累计求和字段
在原始表格中创建一个新的字段,用于存储累计求和的结果。
ALTER TABLE表名
ADD COLUMN累计求和字段数据类型;
3.2 更新累计求和字段的值
使用子查询和JOIN操作更新累计求和字段的值。子查询用于获取每行之前的所有行的求和结果,JOIN操作将子查询结果与原始表格进行关联。
UPDATE表名AS t1
SET t1.累计求和字段 = (
SELECT SUM(t2.待求和字段)
FROM表名AS t2
WHERE t2.排序字段 <= t1.排序字段
);
3.3 示例
假设有一个名为sales的表格,包含以下字段:id(排序字段),amount(待求和字段),cumulative_sum(累计求和字段)。
-- 创建累计求和字段
ALTER TABLE sales
ADD COLUMN cumulative_sum INTEGER;
-- 更新累计求和字段的值
SQL数据库数据的查询,汇总,统计和分析
8.数据的查询、汇总、统计和分析
本章将深入剖析SELECT命令。
8.1.SELECT命令
SELECT是一个用来从一个或多个表中获取数据的SQL命令。
8.2.简单的SELECT查询
如:
SELECT命令至少包含:
➢要出现在查询结果中的字段列表,如:身份证号码,姓名,电话号码
➢字段来自哪些表,如:FROM飞狐工作室
➢字段列表也可以是由字段、常量和函数组成的表达式
➢要列出所有字段,只须用* 号
8.3.设置查询结果的字段名
查询需求
请从数据库pubs的authors表,查询出所有作者的代号、姓名、电话号码及住址,而且请使用中文文字作为查询结果的各字段名。
解答
SELECT 作者代号= au_id,
姓名= au_fname+au_lname,
电话号码= phone,
住址= address
FROM authors
或(看看你更喜欢哪一种格式?)
/* 脚本文件名: Demo92.sql */
USE pubs
SELECT au_id AS 作者代号,
au_fname+au_lname AS 姓名,
phone AS 电话号码,
address AS 住址
FROM authors
注意:
➢如果您设置的的字段名包含空格,则须加上单引号
SELECT au_fname+au_lname AS‘Name of Author’
FROM authors
任务:查询teacher表的姓名、性别和生日,列名用中文表示;查询class表的所有班级
信息;查询teacher表的教师姓名和年龄。
8.4.关键字ALL和DISTINCT的使用
sql汇总数据操作方法
sql汇总数据操作方法
SQL汇总数据操作
1. 简介
在数据库操作中,经常需要对数据进行汇总、统计和计算等操作。SQL提供了多种方式来实现这些功能,本文将介绍常见的SQL汇总数据操作方法。
2. COUNT函数
COUNT函数用于统计表中满足某个条件的记录数量。
SELECT COUNT(*)
FROM 表名
WHERE 条件;
3. SUM函数
SUM函数用于计算表中某个列的合计值。
SELECT SUM(列名)
FROM 表名
WHERE 条件;
4. AVG函数
AVG函数用于计算表中某个列的平均值。
SELECT AVG(列名)
FROM 表名
WHERE 条件;
5. MAX函数和MIN函数
MAX函数和MIN函数分别用于计算表中某个列的最大值和最小值。
SELECT MAX(列名)
FROM 表名
WHERE 条件;
SELECT MIN(列名)
FROM 表名
WHERE 条件;
6. GROUP BY子句
GROUP BY子句用于对结果集进行分组,可用于汇总数据。
SELECT 列名, COUNT(*)
FROM 表名
WHERE 条件
GROUP BY 列名;
7. HAVING子句
HAVING子句用于在GROUP BY子句的基础上进行进一步的过滤。
SELECT 列名, COUNT(*)
FROM 表名
WHERE 条件
GROUP BY 列名
HAVING 条件;
8. WITH ROLLUP
WITH ROLLUP关键字用于在使用GROUP BY进行分组后,在结果集中添加小计和总计。
SELECT 列名1, 列名2, SUM(列名3)
FROM 表名
sql分类汇总函数
sql分类汇总函数
SQL分类汇总函数
引言:
在SQL中,分类汇总函数是一种强大的工具,用于对数据进行分类分组,并计算每个组的汇总结果。这些函数可以对数据进行统计、计算平均值、求和、最大值、最小值等操作。本文将介绍SQL中常用的分类汇总函数,包括COUNT、SUM、AVG、MAX和MIN,同时提供具体的使用示例。
一、COUNT函数
COUNT函数用于统计某个列中非空值的个数。它可以用于任何数据类型的列,包括数字、字符和日期等。COUNT函数的语法如下:SELECT COUNT(column_name) FROM table_name;
其中,column_name是要统计的列名,table_name是要统计的表名。下面是一个示例:
SELECT COUNT(id) FROM students;
该语句将统计students表中id列的非空值的个数。
二、SUM函数
SUM函数用于计算某个列的总和。它只能用于数字类型的列。SUM函数的语法如下:
SELECT SUM(column_name) FROM table_name;
其中,column_name是要计算总和的列名,table_name是要计算的
表名。下面是一个示例:
SELECT SUM(salary) FROM employees;
该语句将计算employees表中salary列的总和。
三、AVG函数
AVG函数用于计算某个列的平均值。它只能用于数字类型的列。AVG 函数的语法如下:
SELECT AVG(column_name) FROM table_name;
SQL数据汇总、连接查询、嵌套查询示例
第五章实验
1.实验目的
1)掌握select语句的基本用法。
2)学会使用order by子句进行排序。
3)学会数据汇总、连接查询、嵌套查询。
2.实验准备
1)在服务器上创建用户数据库。
2)在用户数据库student中创建学生基本信息表、学生成绩表、教师基本信息表、课程信息表、课程安排表、院系代码表、专业代码表、教研室信息表、教师信息表。
3)通过对象资源管理器或sql编辑器向各个数据表输入实验数据。
3.实验内容
(1)查询学生基本信息表中的每个学生的所有数据
Select * from stud_info
(2)在学生基本信息表中查询每个学生的地址和电话
(3)查询stud_id为‘0401010634’的学生的地址和电话
(4)查询stud_info表中性别为女的学生的地址和电话。使用as子句将结果中的名称分别指定为汉字标题
(5)查询计算机应用教研室的教师工资情况
(6)找出所有姓王的教师所对应的技术职称
(7)在学生基本信息表中查询成绩在80~90的学号和课程号及成绩
独立实践:在学生基本信息表中查询出出生日期从“01-01-1987”到“12-31-1987“学生的学号,姓名,家庭住址和邮政编码。
2.子查询的使用
1)查找在计算机工程系工作的教师名册
2)查找计算机工程系中所有担当“计算机专业英语”的教师编号和姓名
3)查找计算机应用技术专业的学生学号、姓名、年龄、电话号码及其家庭地址
4)查找计算机工程系担任“多媒体技术”课程考试的学生的学号、姓名和考试成绩
3.连接查询的使用
(1)下列命令实现stud_info与stud_grade等值内连接
sql循环多行数据,遍历sql查询结果,sql遍历查询结果
sql循环多⾏数据,遍历sql查询结果,sql遍历查询结果 --查询表B,把查询到的数据插⼊临时表#A中,根据表B 的ID 进⾏排序;表#A中的 i 字段由1开始增加排序;
SELECT ROW_NUMBER() OVER ( ORDER BY ID ) i,* INTO #A FROM B
DECLARE @count INT;
SELECT @count=COUNT(1) FROM #A --获取临时表#A 的总数量,⽤来循环;
DECLARE @i INT=1;
WHILE(@i<=@count) --循坏
BEGIN
DECLARE @a_id INT;
--根据⾃增1的 i 字段进⾏对表 #A 进⾏查询,得到 ID;
SELECT @a_id=ID FROM #A WHERE i=@i
--输出ID;
PRINT @a_id
--此处进⾏各种⾃⼰想要的操作。
--避免死循环 @i +1;
SET @i=@i+1;
END
--千万要记得删除临时表 #A,否则下次执⾏会报错:“数据库中已存在名为'#A' 的对象”。
DROP TABLE #A
SQL基本查询与汇总查询
一、基本查询
1.查询所有买家信息。
2.查询所有商品的商品名称、品牌、型号。
3.输出销售表中不同的商品编号(剔除重复行)。
4.输出销售表中前20%的记录信息。
5.输出编号为M04的买家所购商品的记录信息。
6.输出编号为M04的买家在2013年9月所购商品的记录信息。
7.输出商品编号为S01、S04、S05的销售情况。
8.查询2013年7、8月以外的商品销售情况。
9.查询电话号码第一位为6的买家信息。
10.查询电话号码第3位为6或9的买家信息。
11.查询电话号码第3位、第5位为5的买家信息。
12.输出销售表中所有信息,按商品名升序排列,同一商品名按销售数量降序排列。
13.将12题的结果保存到临时表#TTT中,并输出此临时表中的信息。
二、汇总查询
1.查询有多少个不同的买家。
2.查询销售表中商品编号为'S01'的实际销售价格的最高值、最低值、平均值(不考虑销售数量)、加权平均值。
参考:select max(实际销售价格),min(实际销售价格),avg(实际销售价格),
sum(实际销售价格*销售数量)/sum(销售数量) from 销售表
where 商品编号='S01'
3.查询销售表中各买家的销售笔数。
4.查询销售表中各商品的实际销售价格的最高值、最低值。
参考:select max(实际销售价格), min(实际销售价格) from 销售表
group by 商品编号
5.查询商品表中,台式机中各品牌的库存总数。
参考:select 品牌,sum(库存) from 商品表where 商品名称='台式机' group by 品牌
SQL逐行累加实现
SQL逐⾏累加实现
因业务需要查询实现第⼆⾏的数据为第⼀⾏加上第⼆⾏的值来处理,写下SQL语句,特记录如下,以备后⽤!
1. select a.id, sum(b.a) as b
2. from tt as a, tt as b
3. where a.id>=b.id
4. group by a.id
说明tt为表名,id为排序名,a为数值
IDENTITY(INT,1,1)为⾃增
⽹上找的资料如下:
1. --对表中数据逐⾏累加
2.
3. declare @tempTable table(SID int, SCORE int)
4. insert @tempTable
5. select 1, 10 union all
6. select 2, 20 union all
7. select 3, 30 union all
8. select 4, 40 union all
9. select 5, 50
10. --查看添加的数据
11. select * from @tempTable
12. drop table temptable
13. select * into tempTable from @tempTable
14. --=====================================================
15. --1.使⽤⼦查询来计算累加和(⾮常好的⼀个⽅法)
16. --=====================================================
17.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CREATE TABLE tb(ID int PRIMARY KEY,PID int,Num int)
INSERT tb SELECT 1,NULL,100
UNION ALL SELECT 2,1 ,200
UNION ALL SELECT 3,2 ,300
UNION ALL SELECT 4,3 ,400
UNION ALL SELECT 5,1 ,500
UNION ALL SELECT 6,NULL,600
UNION ALL SELECT 7,NULL,700
UNION ALL SELECT 8,7 ,800
UNION ALL SELECT 9,7 ,900
GO
--计算的存储过程
CREATE PROC p_Calc
AS
SET NOCOUNT ON
DECLARE @Level int
SET @Level=1
SELECT ID,PID,SUM_Num=Num,
Level=CASE
WHEN EXISTS(SELECT * FROM tb WHERE PID=a.ID)
THEN 0 ELSE 1 END
INTO # FROM tb a
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
UPDATE a SET
Level=@Level,
SUM_Num=ISNULL(a.SUM_Num,0)+ISNULL(b.SUM_Num,0)
FROM # a,(
SELECT aa.PID,SUM_Num=SUM(aa.SUM_Num)
FROM # aa,(SELECT DISTINCT PID FROM # WHERE Level=@Level-1)bb
WHERE aa.PID=bb.PID
AND NOT EXISTS(
SELECT * FROM # WHERE PID=aa.PID AND Level=0)
GROUP BY aa.PID
)b WHERE a.ID=b.PID
END
SELECT a.*,b.SUM_Num
FROM tb a,# b
WHERE a.ID=b.ID
GO
--调用存储过程进行计算
EXEC p_Calc
/*--结果
ID PID Num SUM_Num
---------------- ------------------ ------------------- --------------------
1 NULL 100 1500
2 1 200 900
3 2 300 700
4 3 400 400
5 1 500 500
6 NULL 600 600
7 NULL 700 2400
8 7 800 800
9 7 900 900
--*/