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

YY4083236 2019-08-10 05:15:32
...全文
778 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



22,301

社区成员

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

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