DECLARE @t TABLE (
InvID INT IDENTITY,
BatchNumber INT,
InvoiceNumber INT,
VisitDate DATETIME,
Amount MONEY )
INSERT INTO @t(BatchNumber, InvoiceNumber,
VisitDate, Amount)
SELECT 10000001,20001,'2009-01-01',50.00 UNION ALL
SELECT 10000001,20001,'2009-01-02',50.00 UNION ALL
SELECT 10000001,20001,'2009-01-03',50.00 UNION ALL
SELECT 10000001,20001,'2009-01-04',50.00 UNION ALL
SELECT 10000001,20002,'2009-01-01',50.00 UNION ALL
SELECT 10000001,20002,'2009-01-02',50.00 UNION ALL
SELECT 10000001,20002,'2009-01-03',50.00 UNION ALL
SELECT 10000001,20003,'2009-01-01',50.00 UNION ALL
SELECT 10000001,20003,'2009-01-02',50.00 UNION ALL
SELECT 10000001,20004,'2009-01-01',50.00 UNION ALL
SELECT 10000001,20004,'2009-01-02',50.00 UNION ALL
SELECT 10000001,20004,'2009-01-03',50.00 UNION ALL
SELECT 10000001,20004,'2009-01-04',50.00 UNION ALL
SELECT 10000001,20004,'2009-01-05',50.00 UNION ALL
SELECT 10000001,20004,'2009-01-06',50.00 UNION ALL
SELECT 10000001,20005,'2009-01-01',50.00 UNION ALL
SELECT 10000001,20005,'2009-01-02',50.00 UNION ALL
SELECT 10000001,20005,'2009-01-13',50.00 UNION ALL
SELECT 10000001,20005,'2009-01-14',50.00 UNION ALL
SELECT 10000001,20005,'2009-01-15',50.00 UNION ALL
SELECT 10000001,20005,'2009-01-06',50.00 UNION ALL
SELECT 10000001,20005,'2009-01-07',50.00 UNION ALL
SELECT 10000001,20005,'2009-01-08',50.00 UNION ALL
SELECT 10000001,20006,'2009-01-01',50.00 UNION ALL
SELECT 10000002,20007,'2009-01-01',50.00 UNION ALL
SELECT 10000002,20007,'2009-01-02',50.00 UNION ALL
SELECT 10000002,20007,'2009-01-03',50.00 UNION ALL
SELECT 10000002,20008,'2009-01-01',50.00 UNION ALL
SELECT 10000002,20008,'2009-01-02',50.00 UNION ALL
SELECT 10000002,20008,'2009-01-03',50.00
/* ASSUME: that
the COUNT for this query is <= 10:
SELECT InvoiceNumber, COUNT(*) FROM @t
GROUP BY InvoiceNumber
*/
CREATE TABLE #CntByBatchInvoice (
BatchNumber INT,
InvoiceNumber INT,
Cnt int,
SetNo int
)
; WITH BaseData AS (
SELECT
InvID,
BatchNumber,
InvoiceNumber,
VisitDate,
Amount
FROM @t
)
,CntByInv AS (
SELECT
"Set" = ROW_NUMBER() OVER (ORDER BY BatchNumber, InvoiceNumber),
BatchNumber,
InvoiceNumber,
Cnt = COUNT(*)
FROM BaseData
GROUP BY
BatchNumber, InvoiceNumber
)
INSERT INTO #CntByBatchInvoice (BatchNumber, InvoiceNumber, Cnt)
SELECT
BatchNumber, InvoiceNumber, Cnt FROM CntByInv
DECLARE
GroupSets_Cursor CURSOR FOR
SELECT
BatchNumber, InvoiceNumber, Cnt
FROM
#CntByBatchInvoice
ORDER BY BatchNumber,
InvoiceNumber
OPEN
GroupSets_Cursor
DECLARE
@BatchNumber int
DECLARE
@InvoiceNumber int
DECLARE @Cnt int
FETCH NEXT FROM
GroupSets_Cursor INTO @BatchNumber, @InvoiceNumber,
@Cnt
DECLARE
@LastBatchNumber int;
SET @LastBatchNumber =
@BatchNumber
DECLARE @RunCnt int; SET @RunCnt = 0
DECLARE @SetNo int; SET @SetNo = 1
WHILE @@FETCH_STATUS = 0
BEGIN
IF @LastBatchNumber <> @BatchNumber
SET @SetNo = 0
IF @LastBatchNumber <> @BatchNumber
OR @RunCnt + @Cnt > 10
BEGIN
SET @SetNo = @SetNo + 1
SET @RunCnt = @Cnt
END
ELSE
SET @RunCnt = @RunCnt + @Cnt
UPDATE #CntByBatchInvoice
SET SetNo = @SetNo
WHERE BatchNumber = @BatchNumber
AND InvoiceNumber = @InvoiceNumber
FETCH NEXT FROM
GroupSets_Cursor INTO @BatchNumber, @InvoiceNumber,
@Cnt
END
CLOSE
GroupSets_Cursor
DEALLOCATE
GroupSets_Cursor
SELECT
T.InvID,
T.BatchNumber,
T.InvoiceNumber,
T.VisitDate,
T.Amount,
"Set" = G.SetNo
FROM @t T
JOIN
#CntByBatchInvoice G
ON G.BatchNumber
= T.BatchNumber
AND G.InvoiceNumber
= T.InvoiceNumber
ORDER BY T.BatchNumber, T.InvoiceNumber
DROP TABLE #CntByBatchInvoice