【据说无解】按月分表带来的分页问题

LittleMo_2012 2016-06-15 11:07:15
开始时间 2016-02-05 14:03 结束时间 2016-06-15 10:39

表名按照年月分的实体表 TB_201602,TB_201603,TB_201604,TB_201605,TB_201606


表结构都是如下:
ID PID PValue AddTime
1 1 24 2016-02-02 10:46
2 1 25 2016-02-02 10:47



ID PID PValue AddTime
1 1 20 2016-03-02 10:46
2 1 28 2016-03-03 10:47
....


1.开始时间,结束时间不定 表中记录数也不定

现在如何取20条数据,最近时间表中拿数据如果不够,去上一个月补,以此类推...
...全文
274 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
LittleMo_2012 2016-06-15
  • 打赏
  • 举报
回复
引用 10 楼 roy_88 的回复:
SQL2008用第2种方法Row_Number
恩恩,我试一下先!
中国风 2016-06-15
  • 打赏
  • 举报
回复
SQL2008用第2种方法Row_Number
LittleMo_2012 2016-06-15
  • 打赏
  • 举报
回复
引用 7 楼 roy_88 的回复:
分页方法 SQL2012之后的版 本offset ..rows fetch next ..rows only 用法 http://blog.csdn.net/roy_88/article/details/51318650 Row_number,N年前写的方法


use tempdb
go
if OBJECT_ID('PageShow','P') is not null
	drop procedure PageShow
go
Create procedure PageShow(
	@QueryStr nvarchar(4000), --表名、视图名、查询语句
	@Where nvarchar(1000)='',--条件
	@PageSize int=10,   --每页的大小(行数)
	@PageCurrent int=1,   --要显示的页
	@FdShow nvarchar (4000)='', --要显示的字段列表
	@FdOrder nvarchar (1000)='' --排序字段列表
)
as
if object_id(@QueryStr) is null
	set @QueryStr='('+@QueryStr+')as Tab'
if @Where>''
	set @Where=' where '+@Where
if @FdShow=''
	set @FdShow='*'
if @FdOrder=''
	set @FdOrder='(select 1)'

declare @Str nvarchar(max)
set @Str='select '+@FdShow+' from (select Row=Row_number()over(order by '+@FdOrder+'),'+@FdShow+
		' from '+@QueryStr+@Where+') as Tab2 where Row between '+rtrim((@PageCurrent-1)*@PageSize+1)+' and '+rtrim(@PageCurrent*@PageSize)
exec(@Str)
go

exec PageShow @QueryStr='sysobjects',@FdShow='ID,Name',@PageCurrent=2,@Where='  ID>100 '
现在用的sqlserver2008
LittleMo_2012 2016-06-15
  • 打赏
  • 举报
回复
引用 6 楼 wmxcn2000 的回复:
这些表名,也应该在一张表里面存着吧?
实体表都在一个数据库
中国风 2016-06-15
  • 打赏
  • 举报
回复
分页方法 SQL2012之后的版 本offset ..rows fetch next ..rows only 用法 http://blog.csdn.net/roy_88/article/details/51318650 Row_number,N年前写的方法


use tempdb
go
if OBJECT_ID('PageShow','P') is not null
	drop procedure PageShow
go
Create procedure PageShow(
	@QueryStr nvarchar(4000), --表名、视图名、查询语句
	@Where nvarchar(1000)='',--条件
	@PageSize int=10,   --每页的大小(行数)
	@PageCurrent int=1,   --要显示的页
	@FdShow nvarchar (4000)='', --要显示的字段列表
	@FdOrder nvarchar (1000)='' --排序字段列表
)
as
if object_id(@QueryStr) is null
	set @QueryStr='('+@QueryStr+')as Tab'
if @Where>''
	set @Where=' where '+@Where
if @FdShow=''
	set @FdShow='*'
if @FdOrder=''
	set @FdOrder='(select 1)'

declare @Str nvarchar(max)
set @Str='select '+@FdShow+' from (select Row=Row_number()over(order by '+@FdOrder+'),'+@FdShow+
		' from '+@QueryStr+@Where+') as Tab2 where Row between '+rtrim((@PageCurrent-1)*@PageSize+1)+' and '+rtrim(@PageCurrent*@PageSize)
exec(@Str)
go

exec PageShow @QueryStr='sysobjects',@FdShow='ID,Name',@PageCurrent=2,@Where='  ID>100 '
卖水果的net 版主 2016-06-15
  • 打赏
  • 举报
回复
这些表名,也应该在一张表里面存着吧?
LittleMo_2012 2016-06-15
  • 打赏
  • 举报
回复
引用 3 楼 roy_88 的回复:
建一个视图,把所有月份生成一个结果集 create view vTB as select * from TB_201602 union all select * from TB_201603 go select top 20 * from vTB where AddTime between 开始日期 and 结束日期
这样能调用相关条件查询,分页存储过程?
中国风 2016-06-15
  • 打赏
  • 举报
回复
取最近20条 select top 20 * from vTB order by AddTime desc
中国风 2016-06-15
  • 打赏
  • 举报
回复
建一个视图,把所有月份生成一个结果集 create view vTB as select * from TB_201602 union all select * from TB_201603 go select top 20 * from vTB where AddTime between 开始日期 and 结束日期
LittleMo_2012 2016-06-15
  • 打赏
  • 举报
回复
引用 1 楼 wmxcn2000 的回复:
你想用一条语句实现,还是一批语句(或存储过程)来实现?
存储过程来实现
卖水果的net 版主 2016-06-15
  • 打赏
  • 举报
回复
你想用一条语句实现,还是一批语句(或存储过程)来实现?

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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