我有一个查询,该查询按区域返回位置列表,该区域在查询中作为子句运行。问题是,我需要将位置列表分成三个单独的部分,以便可以对这三个组中的每一个运行主查询。例如,区域1返回15个位置的计数。我想获取前5个,运行我的报告,然后获取第二个5,运行我的报告,最后获取最后5个并运行我的报告。这必须是动态的,因为要添加或删除新位置。
SELECT
tExceptionsAll1.ID,
tExceptionsAll1.CardholderName,
PCARDS_ILL_DBO_CARD.PERSON_ID,
tExceptionsAll1.CardType,
tExceptionsAll1.Duration,
tExceptionsAll1.ExceptionType,
tExceptionsAll1.STL AS [Exp STL],
tExceptionsAll1.CL AS [Exp CL],
tExceptionsAll1.TempSTL As [Exp TempSTL],
tExceptionsAll1.TempCL As [Exp TempCL],
PCARDS_ILL_DBO_CARD.TRANS_LIMIT_AMT AS [Card STL],
PCARDS_ILL_DBO_CARD.MONTH_LIMIT_AMT AS [Card CL],
tExceptionsAll1.TerminationDate,
tExceptionsAll1.DCMNames,
tExceptionsAll1.ReminderDate
FROM PCARDS_ILL_DBO_CARD
INNER JOIN tExceptionsAll1
ON PCARDS_ILL_DBO_CARD.CARD_ID = CLNG(tExceptionsAll1.CardID)
AND CLNG(PCARDS_ILL_DBO_CARD.PERSON_ID) = tExceptionsAll1.CardholderUIN
WHERE
(tExceptionsAll1.STL > 0 AND
tExceptionsAll1.CL > 0 AND
PCARDS_ILL_DBO_CARD.TRANS_LIMIT_AMT <> tExceptionsAll1.STL AND
PCARDS_ILL_DBO_CARD.MONTH_LIMIT_AMT <> tExceptionsAll1.CL AND
tExceptionsAll1.TerminationDate IS NULL)
OR
(tExceptionsAll1.TempSTL > 0 AND
tExceptionsAll1.TempCL > 0 AND
PCARDS_ILL_DBO_CARD.TRANS_LIMIT_AMT <> tExceptionsAll1.TempSTL AND
PCARDS_ILL_DBO_CARD.MONTH_LIMIT_AMT <> tExceptionsAll1.TempCL AND
tExceptionsAll1.TerminationDate IS NULL AND
tExceptionsAll1.Duration like 'One-Time' AND
tExceptionsAll1.ReminderDate < date());
我需要返回前5个位置,然后返回第二个位置(在本例中为4个)。
答案 0 :(得分:1)
您可以考虑使用NTILE()函数吗?
答案 1 :(得分:0)
李,
使用OFFSET
和FETCH
之后,您可以完成自己的工作。例如:
DECLARE @Divisor int = 3
DECLARE @PartNo int = 3
DECLARE @Total int = (SELECT COUNT(*) FROM IR_Doc_Ref)
DECLARE @SegLength int = @Total/@Divisor
DECLARE @Skip int = (@PartNo - 1) * @SegLength
DECLARE @Take int = @SegLength
SELECT * FROM Zones
ORDER BY ID --Any row will do here.
OFFSET (@Skip) ROWS FETCH NEXT (@Take) ROWS ONLY
当然,这假设您的记录数可以被除数平均除。如果不是,则需要合并模数(%)运算符。希望这会有所帮助。