SQL 分组获取序号
第一个结果集是数据源。
第二个数据集是需要得到的结果集。
CREATE TABLE #t(a varchar(50),b varchar(50),c varchar(50),amount int)
--------------- #tmp_GridResults_1 ---------------
SELECT * INTO #tmp_GridResults_1
FROM (
SELECT N'a1' AS [a], N'b1' AS [b], N'c1' AS [c], N'10' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c1' AS [c], N'40' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c1' AS [c], N'40' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c1' AS [c], N'10' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c1' AS [c], N'50' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'30' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'40' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'10' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'10' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'30' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'30' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'70' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'30' AS [amount] ) t;
INSERT INTO #t([a], [b], [c], [amount])
SELECT [a], [b], [c], [amount]
FROM #tmp_GridResults_1
SELECT * FROM #t --数据源
--首先按a,b,c3列分组(组号放到head列),一个head序号至多包含4条组数据,超过4条时head累加1。同一head组中amount累加不超过60,若超过60,再另外分组
--结构数据集的行数和源数据行数相同
--如以上测试数据,需要得到的数据结果为
SELECT '1' AS head,'1' AS item, N'a1' AS [a], N'b1' AS [b], N'c1' AS [c], N'10' AS [amount] UNION ALL
SELECT '1' AS head,'2' AS item, N'a1' AS [a], N'b1' AS [b], N'c1' AS [c], N'40' AS [amount] UNION ALL
SELECT '1' AS head,'3' AS item, N'a1' AS [a], N'b1' AS [b], N'c1' AS [c], N'10' AS [amount] UNION ALL
SELECT '2' AS head,'1' AS item, N'a1' AS [a], N'b1' AS [b], N'c1' AS [c], N'40' AS [amount] UNION ALL
SELECT '3' AS head,'1' AS item, N'a1' AS [a], N'b1' AS [b], N'c1' AS [c], N'50' AS [amount] UNION ALL
SELECT '4' AS head,'1' AS item, N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'40' AS [amount] UNION ALL
SELECT '4' AS head,'2' AS item, N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'10' AS [amount] UNION ALL
SELECT '4' AS head,'3' AS item, N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'10' AS [amount] UNION ALL
SELECT '5' AS head,'1' AS item, N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'30' AS [amount] UNION ALL
SELECT '5' AS head,'2' AS item, N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'30' AS [amount] UNION ALL
SELECT '6' AS head,'1' AS item, N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'30' AS [amount] UNION ALL
SELECT '6' AS head,'2' AS item, N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'30' AS [amount] UNION ALL
SELECT '7' AS head,'1' AS item, N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'70' AS [amount]
DROP TABLE #tmp_GridResults_1
DROP TABLE #t
GO
相关推荐
SqlServer 序号列的实现方法
对于 SQL SERVER 2000 及更早的版本,需要使用一个自增列,结合临时表来实现。
sql server如何利用开窗函数over()进行分组统计
这是一道常见的面试题,在实际项目中经常会用到。 需求:求出以产品类别为分组,各个分组里价格最高的产品信息。 实现过程如下: declare @t table( ProductID int, ProductName varchar(20), ProductType varchar(20), Price int) –测试数据 insert @t select 1,'name1','P1',3 union all select 2,'name2','P1',5 union all select 3,'name3','P2',4 union all select 4,'name4','P2'
SQL为查询的结果加上序号(ROW_NUMBER) 合并多个查询结果
SQL为查询的结果加上序号(ROW_NUMBER) 合并多个查询结果
Sql Server 开窗函数Over()的使用实例详解
主要介绍了Sql Server 开窗函数Over()的使用,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
Hive SQL大厂必考常用窗口函数及面试题.pdf
窗⼝函数也称为OLAP函数,OLAP 是OnLine Analytical Processing 的简称,意思是对数据库数据进⾏实时分析处理。例如,市场分析、创建财务报表、创建计划等⽇常性商务⼯作。窗⼝函数就是为了实现OLAP ⽽添加的标准SQL 功能。 聚合函数是将多条记录聚合为⼀条;窗⼝函数是每条记录都会执⾏,有⼏条记录执⾏完还是⼏条。窗⼝函数兼具GROUP BY ⼦句的分组功能以及ORDER BY ⼦句的排序功能。但是,PARTITION BY ⼦句并不具备 GROUP BY ⼦句的汇总功能。


应用实例
