SQL Server 如何从一个使用分页为每个票证ID返回两条记录的视图中返回100个不同的票证ID数据?

iezvtpos  于 2022-11-21  发布在  其他
关注(0)|答案(1)|浏览(109)

我 有 一 个 返回 两 列 * * Ticket _ Id * * 和 * * Price * * 的 视图 。 每张 票 最 多 可以 有 2 个 不同 的 价格 。 除 此 之外 , 我 还有 一 个 存储 过程 , 它 根据 分页 的 输入 参数 将 数据 从 视图 返回 给 调用 者 。

@page     : indicates the page number
@pageSize : indicates the number of records per page.

中 的 每 一 个
当 一 个 用户 请求 100 行 ( 唯一 票据 ) 时 , 我 将 不得 不 返回 最 多 200 行 数据 。
x1月 1 日
但是 它 只 返回 100 行 数据 , 包括 重复 的 数据 。 有 没有 办法 修改 分页 参数 来 检索 所有 200 行 数据 ?
示例 : 视图 返回 如下 :
| 票证 标识|标价|
| - -| - -|
| 票证 1| 10 个|
| 票证 1|十二|
| 票证 2|十一|
| 票证 2|十三|
| 票证 3|十二|
| 票证 3|十四|
当 用户 用 输入 参数 请求 时 :

@page = 1 , @PageSize = 3

格式
我 需要 返回 所有 6 行 数据 。

    • 视图 ( 使用 视图 是 因为 存储 过程 不能 直接 访问 票证 表 ) * *
select tck.ticket_id, tck.cost as 'price'
        --,RANK() OVER(ORDER BY tck.ticket_id) 'Rank'
                        
    from tickets tck with (NOLOCK)

格式
存储 过程 :

ALTER PROCEDURE [dbo].[p_trans_history_srch]
    -- Add the parameters for the stored procedure here
    @page   int=1,              --optional
    @pageSize   int=20          --optional
AS
BEGIN
    declare @finalsqlstmt nvarchar(max)
    declare @pageString nvarchar(max)
    declare @pageCount nvarchar(max) = ''
    declare @viewName nvarchar(max)

    set @pageString =concat(' OFFSET ', @pageSize,' * (',@page,' - 1) ROWS FETCH NEXT ', @pageSize,' ROWS ONLY')

    set @finalsqlstmt = concat('select * from ',dbo.f_get_dbname(),@viewName,'where ',@search ,' and created_date between ''',@startDate,''' and ''',@endDate,''' order by created_date desc ',@pageString)

    set @pageCount =concat('select count(distinct ticket_id) from ',dbo.f_get_dbname(),@viewName,'where ',@search,' and created_date between ''',@startDate,''' and ''',@endDate,'''' )
    
    exec (@finalsqlstmt)
    exec (@pageCount)

END

格式

    • 注意 : 我 尝试 使用 RANK() OVER(ORDER BY ticket_id) 'Rank' 并 根据 排名 返回 数据 , 但 由于 表 太 大 , 查询 性能 急剧 下降 。 * *
iugsix8n

iugsix8n1#

如果将两个价格转换为两列(例如“A”和“B”),您可以得到“100行”。我不知道这在您的情况下是否是一个选项,但这里有一个示例:

DECLARE @t6 TABLE (A VARCHAR(100), B INT)

INSERT INTO @t6 (A,B)
          SELECT 'ticket1',10
UNION ALL SELECT 'ticket1',12
UNION ALL SELECT 'ticket2',11
UNION ALL SELECT 'ticket2',13
UNION ALL SELECT 'ticket3',12
UNION ALL SELECT 'ticket3',14

;WITH cte_topivot AS
(
    SELECT 
        [A],
        CASE WHEN ROW_NUMBER() OVER (PARTITION BY A ORDER BY B ASC) = 1 
            THEN 'ticketA' ELSE 'ticketB' END [pivotCol],
        [B]
    FROM @t6 t
)
SELECT p.* 
FROM cte_toPivot tp
PIVOT(MIN(B) FOR pivotCol IN ([ticketA],[ticketB])) p

否则,如果总是得到所需行数的一半,是否可以将用户提供的页面大小乘以2?

相关问题