求,使用SQL语句根据页数计算页号

YY4083236 2019-08-10 05:15:32
...全文
781 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
宇宙中的Philip 2019-08-14
  • 打赏
  • 举报
回复
你看下这个执行结果是你想要的么?我是在PL/SQL DEVELOPER写的 WITH V AS( SELECT 1 ITEM_NO,'000' OWNER_ID,81 AMOUNT_OF_PAGED FROM DUAL UNION ALL SELECT 2,'000',5 FROM DUAL UNION ALL SELECT 3,'000',5 FROM DUAL UNION ALL SELECT 4,'000',8 FROM DUAL UNION ALL SELECT 5,'000',11 FROM DUAL UNION ALL SELECT 6,'000',18 FROM DUAL UNION ALL SELECT 7,'000',1 FROM DUAL UNION ALL SELECT 8,'000',24 FROM DUAL UNION ALL SELECT 9,'000',11 FROM DUAL UNION ALL SELECT 10,'000',14 FROM DUAL ) SELECT V.ITEM_NO,V.OWNER_ID,V.AMOUNT_OF_PAGED, NVL(SUM(AMOUNT_OF_PAGED) --SUM()分析函数 OVER(PARTITION BY OWNER_ID ORDER BY ITEM_NO ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING),0)+1 PAGE_NO --要不想第一行改变值,可以将终点设置为1 PRECEDING,即前一行,当扫描第一行时, --也就是从第一行起点到它的前一行,前一行为空,第一行就不会改变值 FROM V;
二月十六 2019-08-13
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([item_no] int,[AMOUNT_OF_PAGED] INT,PAGE_NO int)
Insert #T
select 1,81,0 union all
select 2,5,0 union all
select 3,5,0 union all
select 4,8,0 union all
select 5,11,0 union all
select 6,18,0 union all
select 7,1,0 union all
select 8,24,0 union all
select 9,11,0 union all
select 10,14,0
Go
--测试数据结束
;WITH cte AS (
Select *,1 AS tempPAGE_NO from #T WHERE item_no=1
UNION ALL
SELECT #T.*,cte.PAGE_NO+cte.AMOUNT_OF_PAGED FROM #T JOIN cte ON cte.item_no+1 = #T.item_no
)
UPDATE #T SET PAGE_NO=cte.tempPAGE_NO FROM cte WHERE #T.item_no=cte.item_no

SELECT * FROM #T

RINK_1 2019-08-13
  • 打赏
  • 举报
回复
引用 17 楼 YY4083236 的回复:
[quote=引用 16 楼 二月十六 的回复:]
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([item_no] int,[AMOUNT_OF_PAGED] INT,PAGE_NO int)
Insert #T
select 1,81,0 union all
select 2,5,0 union all
select 3,5,0 union all
select 4,8,0 union all
select 5,11,0 union all
select 6,18,0 union all
select 7,1,0 union all
select 8,24,0 union all
select 9,11,0 union all
select 10,14,0
Go
--测试数据结束
;WITH cte AS (
Select *,1 AS tempPAGE_NO from #T WHERE item_no=1
UNION ALL
SELECT #T.*,cte.PAGE_NO+cte.AMOUNT_OF_PAGED FROM #T JOIN cte ON cte.item_no+1 = #T.item_no
)
UPDATE #T SET PAGE_NO=cte.tempPAGE_NO FROM cte WHERE #T.item_no=cte.item_no

SELECT * FROM #T

如果要在sqlserver2000版本下运行应该怎么改呢?这个在2000版本下运行报错。[/quote] 用子查询。
二月十六 2019-08-13
  • 打赏
  • 举报
回复
引用 17 楼 YY4083236 的回复:
[quote=引用 16 楼 二月十六 的回复:]
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([item_no] int,[AMOUNT_OF_PAGED] INT,PAGE_NO int)
Insert #T
select 1,81,0 union all
select 2,5,0 union all
select 3,5,0 union all
select 4,8,0 union all
select 5,11,0 union all
select 6,18,0 union all
select 7,1,0 union all
select 8,24,0 union all
select 9,11,0 union all
select 10,14,0
Go
--测试数据结束
;WITH cte AS (
Select *,1 AS tempPAGE_NO from #T WHERE item_no=1
UNION ALL
SELECT #T.*,cte.PAGE_NO+cte.AMOUNT_OF_PAGED FROM #T JOIN cte ON cte.item_no+1 = #T.item_no
)
UPDATE #T SET PAGE_NO=cte.tempPAGE_NO FROM cte WHERE #T.item_no=cte.item_no

SELECT * FROM #T

如果要在sqlserver2000版本下运行应该怎么改呢?这个在2000版本下运行报错。[/quote] 2000太老了……从工作开始就没用过2000……我也不太清楚2000有啥能用啥不能用
YY4083236 2019-08-13
  • 打赏
  • 举报
回复
引用 16 楼 二月十六 的回复:
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([item_no] int,[AMOUNT_OF_PAGED] INT,PAGE_NO int)
Insert #T
select 1,81,0 union all
select 2,5,0 union all
select 3,5,0 union all
select 4,8,0 union all
select 5,11,0 union all
select 6,18,0 union all
select 7,1,0 union all
select 8,24,0 union all
select 9,11,0 union all
select 10,14,0
Go
--测试数据结束
;WITH cte AS (
Select *,1 AS tempPAGE_NO from #T WHERE item_no=1
UNION ALL
SELECT #T.*,cte.PAGE_NO+cte.AMOUNT_OF_PAGED FROM #T JOIN cte ON cte.item_no+1 = #T.item_no
)
UPDATE #T SET PAGE_NO=cte.tempPAGE_NO FROM cte WHERE #T.item_no=cte.item_no

SELECT * FROM #T

如果要在sqlserver2000版本下运行应该怎么改呢?这个在2000版本下运行报错。
YY4083236 2019-08-12
  • 打赏
  • 举报
回复
引用 14 楼 二月十六 的回复:
引用 13 楼 YY4083236 的回复:
引用 12 楼 二月十六 的回复:
执行一下看看
在sqlserver2012上面可以执行,刚刚是我连接的服务器连接成sqlserver2000了。大神,我在问下修改语句怎么写呢,你这个是查询语句对吧。
把结果作为一个临时表,关联更新可以,现在手边没电脑了,明天写一下
好的,谢谢大神
二月十六 2019-08-12
  • 打赏
  • 举报
回复
引用 13 楼 YY4083236 的回复:
引用 12 楼 二月十六 的回复:
执行一下看看
在sqlserver2012上面可以执行,刚刚是我连接的服务器连接成sqlserver2000了。大神,我在问下修改语句怎么写呢,你这个是查询语句对吧。
把结果作为一个临时表,关联更新可以,现在手边没电脑了,明天写一下
YY4083236 2019-08-12
  • 打赏
  • 举报
回复
引用 12 楼 二月十六 的回复:
执行一下看看
在sqlserver2012上面可以执行,刚刚是我连接的服务器连接成sqlserver2000了。大神,我在问下修改语句怎么写呢,你这个是查询语句对吧。
二月十六 2019-08-12
  • 打赏
  • 举报
回复
执行一下看看
二月十六 2019-08-12
  • 打赏
  • 举报
回复
SELECT @@VERSION
YY4083236 2019-08-12
  • 打赏
  • 举报
回复
二月十六 2019-08-12
  • 打赏
  • 举报
回复
引用 8 楼 YY4083236 的回复:
[quote=引用 7 楼 二月十六 的回复:] [quote=引用 6 楼 YY4083236 的回复:] [quote=引用 4 楼 二月十六 的回复:] [quote=引用 3 楼 YY4083236 的回复:][quote=引用 1 楼 二月十六 的回复:] 我的写法主要的知识点就是递归循环处理,我简单写一下,特殊情况不多考虑了(默认itemno是主键连续自增的,如果不是就自己再加一个rownum,然后最后一行165的没处理,处理的话,获取表中最大item,这行的pageno=pageno+'-'(pageno+amountofparger))
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([item_no] int,[AMOUNT_OF_PAGED] int)
Insert #T
select 1,81 union all
select 2,5 union all
select 3,5 union all
select 4,8 union all
select 5,11 union all
select 6,18 union all
select 7,1 union all
select 8,24 union all
select 9,11 union all
select 10,14
Go
--测试数据结束
;WITH cte AS (
Select *,1 AS PAGE_NO from #T WHERE item_no=1
UNION ALL
SELECT #T.*,cte.PAGE_NO+cte.AMOUNT_OF_PAGED FROM #T JOIN cte ON cte.item_no+1 = #T.item_no
)
SELECT * FROM cte

执行你的语句后报错了,而且可能是我没有写清楚问题,同一个file表里有很多数据,但是计算页号的条件之一是owner_id相同的循环计算,owner_id不同的又重新开始计算,1楼你好像没有加上这个条件。[/quote]你的数据库是什么?报什么错了?[/quote]SQLserver2012和sqlserver2000版本都试过了[/quote] 2012报什么错?[/quote]看图[/quote] 看不到你的第二行,代码网上弄点
YY4083236 2019-08-12
  • 打赏
  • 举报
回复
引用 7 楼 二月十六 的回复:
[quote=引用 6 楼 YY4083236 的回复:] [quote=引用 4 楼 二月十六 的回复:] [quote=引用 3 楼 YY4083236 的回复:][quote=引用 1 楼 二月十六 的回复:] 我的写法主要的知识点就是递归循环处理,我简单写一下,特殊情况不多考虑了(默认itemno是主键连续自增的,如果不是就自己再加一个rownum,然后最后一行165的没处理,处理的话,获取表中最大item,这行的pageno=pageno+'-'(pageno+amountofparger))
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([item_no] int,[AMOUNT_OF_PAGED] int)
Insert #T
select 1,81 union all
select 2,5 union all
select 3,5 union all
select 4,8 union all
select 5,11 union all
select 6,18 union all
select 7,1 union all
select 8,24 union all
select 9,11 union all
select 10,14
Go
--测试数据结束
;WITH cte AS (
Select *,1 AS PAGE_NO from #T WHERE item_no=1
UNION ALL
SELECT #T.*,cte.PAGE_NO+cte.AMOUNT_OF_PAGED FROM #T JOIN cte ON cte.item_no+1 = #T.item_no
)
SELECT * FROM cte

执行你的语句后报错了,而且可能是我没有写清楚问题,同一个file表里有很多数据,但是计算页号的条件之一是owner_id相同的循环计算,owner_id不同的又重新开始计算,1楼你好像没有加上这个条件。[/quote]你的数据库是什么?报什么错了?[/quote]SQLserver2012和sqlserver2000版本都试过了[/quote] 2012报什么错?[/quote]看图
二月十六 2019-08-12
  • 打赏
  • 举报
回复
引用 6 楼 YY4083236 的回复:
[quote=引用 4 楼 二月十六 的回复:] [quote=引用 3 楼 YY4083236 的回复:][quote=引用 1 楼 二月十六 的回复:] 我的写法主要的知识点就是递归循环处理,我简单写一下,特殊情况不多考虑了(默认itemno是主键连续自增的,如果不是就自己再加一个rownum,然后最后一行165的没处理,处理的话,获取表中最大item,这行的pageno=pageno+'-'(pageno+amountofparger))
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([item_no] int,[AMOUNT_OF_PAGED] int)
Insert #T
select 1,81 union all
select 2,5 union all
select 3,5 union all
select 4,8 union all
select 5,11 union all
select 6,18 union all
select 7,1 union all
select 8,24 union all
select 9,11 union all
select 10,14
Go
--测试数据结束
;WITH cte AS (
Select *,1 AS PAGE_NO from #T WHERE item_no=1
UNION ALL
SELECT #T.*,cte.PAGE_NO+cte.AMOUNT_OF_PAGED FROM #T JOIN cte ON cte.item_no+1 = #T.item_no
)
SELECT * FROM cte

执行你的语句后报错了,而且可能是我没有写清楚问题,同一个file表里有很多数据,但是计算页号的条件之一是owner_id相同的循环计算,owner_id不同的又重新开始计算,1楼你好像没有加上这个条件。[/quote]你的数据库是什么?报什么错了?[/quote]SQLserver2012和sqlserver2000版本都试过了[/quote] 2012报什么错?
YY4083236 2019-08-12
  • 打赏
  • 举报
回复
引用 4 楼 二月十六 的回复:
[quote=引用 3 楼 YY4083236 的回复:][quote=引用 1 楼 二月十六 的回复:] 我的写法主要的知识点就是递归循环处理,我简单写一下,特殊情况不多考虑了(默认itemno是主键连续自增的,如果不是就自己再加一个rownum,然后最后一行165的没处理,处理的话,获取表中最大item,这行的pageno=pageno+'-'(pageno+amountofparger))
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([item_no] int,[AMOUNT_OF_PAGED] int)
Insert #T
select 1,81 union all
select 2,5 union all
select 3,5 union all
select 4,8 union all
select 5,11 union all
select 6,18 union all
select 7,1 union all
select 8,24 union all
select 9,11 union all
select 10,14
Go
--测试数据结束
;WITH cte AS (
Select *,1 AS PAGE_NO from #T WHERE item_no=1
UNION ALL
SELECT #T.*,cte.PAGE_NO+cte.AMOUNT_OF_PAGED FROM #T JOIN cte ON cte.item_no+1 = #T.item_no
)
SELECT * FROM cte

执行你的语句后报错了,而且可能是我没有写清楚问题,同一个file表里有很多数据,但是计算页号的条件之一是owner_id相同的循环计算,owner_id不同的又重新开始计算,1楼你好像没有加上这个条件。[/quote]你的数据库是什么?报什么错了?[/quote]SQLserver2012和sqlserver2000版本都试过了
YY4083236 2019-08-12
  • 打赏
  • 举报
回复
引用 2 楼 RINK_1 的回复:
借用#1版主的数据

if not object_id(N'Tempdb..#T') is null
    drop table #T
Go
Create table #T([item_no] int,[AMOUNT_OF_PAGED] int)
Insert #T
select 1,81 union all
select 2,5 union all
select 3,5 union all
select 4,8 union all
select 5,11 union all
select 6,18 union all
select 7,1 union all
select 8,24 union all
select 9,11 union all
select 10,14
Go


SELECT A.*,
CASE WHEN ITEM_NO=(SELECT MAX(ITEM_NO) FROM #T) THEN CAST(B.PAGE_NO+1 AS VARCHAR)+'-'+CAST(B.PAGE_NO+AMOUNT_OF_PAGED AS VARCHAR)
WHEN ISNULL(B.PAGE_NO,0)=0 THEN '1' 
ELSE CAST(B.PAGE_NO+1 AS VARCHAR) END AS PAGE_NO
FROM #T A
OUTER APPLY (SELECT SUM(AMOUNT_OF_PAGED) AS PAGE_NO FROM #T WHERE item_no<A.item_no) AS B
执行2楼你的语句也报错了sqlserver2012和sqlserver2000数据库版本中都执行报错了
二月十六 2019-08-12
  • 打赏
  • 举报
回复
引用 3 楼 YY4083236 的回复:
[quote=引用 1 楼 二月十六 的回复:] 我的写法主要的知识点就是递归循环处理,我简单写一下,特殊情况不多考虑了(默认itemno是主键连续自增的,如果不是就自己再加一个rownum,然后最后一行165的没处理,处理的话,获取表中最大item,这行的pageno=pageno+'-'(pageno+amountofparger))
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([item_no] int,[AMOUNT_OF_PAGED] int)
Insert #T
select 1,81 union all
select 2,5 union all
select 3,5 union all
select 4,8 union all
select 5,11 union all
select 6,18 union all
select 7,1 union all
select 8,24 union all
select 9,11 union all
select 10,14
Go
--测试数据结束
;WITH cte AS (
Select *,1 AS PAGE_NO from #T WHERE item_no=1
UNION ALL
SELECT #T.*,cte.PAGE_NO+cte.AMOUNT_OF_PAGED FROM #T JOIN cte ON cte.item_no+1 = #T.item_no
)
SELECT * FROM cte

执行你的语句后报错了,而且可能是我没有写清楚问题,同一个file表里有很多数据,但是计算页号的条件之一是owner_id相同的循环计算,owner_id不同的又重新开始计算,1楼你好像没有加上这个条件。[/quote]你的数据库是什么?报什么错了?
YY4083236 2019-08-12
  • 打赏
  • 举报
回复
引用 1 楼 二月十六 的回复:
我的写法主要的知识点就是递归循环处理,我简单写一下,特殊情况不多考虑了(默认itemno是主键连续自增的,如果不是就自己再加一个rownum,然后最后一行165的没处理,处理的话,获取表中最大item,这行的pageno=pageno+'-'(pageno+amountofparger))
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([item_no] int,[AMOUNT_OF_PAGED] int)
Insert #T
select 1,81 union all
select 2,5 union all
select 3,5 union all
select 4,8 union all
select 5,11 union all
select 6,18 union all
select 7,1 union all
select 8,24 union all
select 9,11 union all
select 10,14
Go
--测试数据结束
;WITH cte AS (
Select *,1 AS PAGE_NO from #T WHERE item_no=1
UNION ALL
SELECT #T.*,cte.PAGE_NO+cte.AMOUNT_OF_PAGED FROM #T JOIN cte ON cte.item_no+1 = #T.item_no
)
SELECT * FROM cte

执行你的语句后报错了,而且可能是我没有写清楚问题,同一个file表里有很多数据,但是计算页号的条件之一是owner_id相同的循环计算,owner_id不同的又重新开始计算,1楼你好像没有加上这个条件。
RINK_1 2019-08-12
  • 打赏
  • 举报
回复
借用#1版主的数据

if not object_id(N'Tempdb..#T') is null
    drop table #T
Go
Create table #T([item_no] int,[AMOUNT_OF_PAGED] int)
Insert #T
select 1,81 union all
select 2,5 union all
select 3,5 union all
select 4,8 union all
select 5,11 union all
select 6,18 union all
select 7,1 union all
select 8,24 union all
select 9,11 union all
select 10,14
Go


SELECT A.*,
CASE WHEN ITEM_NO=(SELECT MAX(ITEM_NO) FROM #T) THEN CAST(B.PAGE_NO+1 AS VARCHAR)+'-'+CAST(B.PAGE_NO+AMOUNT_OF_PAGED AS VARCHAR)
WHEN ISNULL(B.PAGE_NO,0)=0 THEN '1' 
ELSE CAST(B.PAGE_NO+1 AS VARCHAR) END AS PAGE_NO
FROM #T A
OUTER APPLY (SELECT SUM(AMOUNT_OF_PAGED) AS PAGE_NO FROM #T WHERE item_no<A.item_no) AS B
二月十六 2019-08-12
  • 打赏
  • 举报
回复
我的写法主要的知识点就是递归循环处理,我简单写一下,特殊情况不多考虑了(默认itemno是主键连续自增的,如果不是就自己再加一个rownum,然后最后一行165的没处理,处理的话,获取表中最大item,这行的pageno=pageno+'-'(pageno+amountofparger))

--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([item_no] int,[AMOUNT_OF_PAGED] int)
Insert #T
select 1,81 union all
select 2,5 union all
select 3,5 union all
select 4,8 union all
select 5,11 union all
select 6,18 union all
select 7,1 union all
select 8,24 union all
select 9,11 union all
select 10,14
Go
--测试数据结束
;WITH cte AS (
Select *,1 AS PAGE_NO from #T WHERE item_no=1
UNION ALL
SELECT #T.*,cte.PAGE_NO+cte.AMOUNT_OF_PAGED FROM #T JOIN cte ON cte.item_no+1 = #T.item_no
)
SELECT * FROM cte



内容概要:本文介绍了软件定义汽车(SDV)的最佳实践案例,重点围绕基于Vector技术的电子电气(E/E)架构设计与实现。文档展示了高算力计算平台(HPC)、区域控制器(Zone ECU)和车载网络(如CAN、Ethernet)的系统架构布局,并结合AUTOSAR操作系统(Classic/Adaptive)、虚拟化(Hypervisor)和SOA服务设计,构建现代化车载系统。通过vCANdrive平台演示了从开发、测试(SIL/HIL)、到OTA升级的全流程,涵盖传感器、执行器、应用层软件及云端协同的集成方案。同时展示了硬件原型(如树莓派、Triboard)和MICROSAR系列工具链在实际项目中的应用。; 适合人群:从事汽车电子系统开发、车载软件架构设计以及智能网联汽车研发的工程师和技术管理人员,具备一定的嵌入式系统或AUTOSAR基础者更佳。; 使用场景及目标:①理解软件定义汽车的整体架构设计方法;②掌握基于Vector工具链的HPC与区域控制器集成方案;③实现OTA更新、SIL/HIL测试、ETH-CAN通信转换等关键技术验证;④支持智能驾驶(ADAS)与智能座舱(IVI)系统的快速原型开发。; 阅读建议:建议结合Vector相关工具(如PREEvision、CANoe4SW、MICROSAR)进行实践操作,重点关注系统分层设计、通信机制与软件更新流程,同时可参考文档中的硬件连接示意图与信映射关系进行仿真与实车验证。

22,299

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧