大概思路,假设有一个分页功能,我们的输入:页码索引值 返回:相应页面的信息
输入的页码索引值->有一个总页码数,才能有索引值,页面上还应该有记录的数量,可能还有额外的参数作为筛选条件
相应页面的信息->一个按某个规则的生成记录集取出索引的一部分(小于或等于固定设定的记录数)
参数:iPageIndex,iPageSize,iToTal(这个作为返回值,可以是符合筛选条件的总的记录数或者页数)
一、存储过程实现分页
--分两部分思路,1.获得要求的记录集 2.分页
ALTER PROC [dbo].[LoadPageCoustomerData]
@pageIndex int,
@pageSize int ,
@starTime datetime,
@endTime dateTime,
@totalCount int output
as
--按客户统计,关键字段:客户ID、客户姓名、客户电话、客户车牌号、销售数量、销售金额
select CustomerId,Name,Tel,PlateNumber,TotalCount,TotalMoney into #Temp from(
SELECT Cus.CustomerId,Cus.Name,Cus.Tel,Cus.PlateNumber,SUM(ISNULL(T.CommodityCount,0)) as TotalCount,SUM(ISNULL(T.Money,0)) as TotalMoney FROM Trade AS T
RIGHT JOIN CustomerInfo AS Cus ON Cus.CustomerId = T.CustomerId
LEFT JOIN CommoditiesList AS Comlist ON Comlist.CommodityId= T.CommodityId
where SalesTime > @starTime and SalesTime < @endTime
group by Cus.CustomerId,Cus.Name,Cus.Tel,Cus.PlateNumber
) as d
--select * from #Temp
--获得活动总纪录数
SELECT @totalCount= COUNT(1) FROM #Temp;
--分页
SELECT CustomerId,Name,Tel,PlateNumber,TotalCount,TotalMoney
FROM
(
SELECT fp.*
,ROW_NUMBER() OVER (ORDER BY fp.CustomerId asc) AS RowIndex --row_number()over(规则)常用来作为分页索--引
FROM #Temp AS fp
) g
--INNER JOIN Data.TestInfo AS b WITH (NOLOCK) ON b.ID = g.ID
WHERE g.RowIndex > ((@PageIndex-1)*@PageSize) AND g.RowIndex <=( @PageIndex*@PageSize);
--先清除,再删除,速度快
truncate table #Temp;
drop table #Temp
二、利用TOP、not in简单的SQL实现
不推荐,not in不符合SQL语句的优化规则.
举例:
select TOP 2 CustomerId from CustomerInfo
where CustomerId
not in
(
select TOP 5 t.CustomerId from --customid是top的依据
(
select * from
CustomerInfo where CredentialsType = 1 --筛选条件
) as t
)
这样找出的是第6、7的记录。语句:找出表中不在前5的前2条记录。(我的理解)
还有更多的分页方法,不在列举了。