我正在尝试使用以下SQL生成每个订单号每页3行的报告。 从结果中可以看出字段Actual&预期不符合。
任何帮助都将不胜感激。
set nocount on
DECLARE @Orders TABLE (Expected int, OrderNumber INT, OrderDetailsNumber int)
Insert into @orders values (0,1,1)
Insert into @orders values (0,1,2)
Insert into @orders values (0,1,3)
Insert into @orders values (1,1,4)
Insert into @orders values (2,2,5)
Insert into @orders values (2,2,6)
Insert into @orders values (2,2,7)
Insert into @orders values (3,2,8)
Insert into @orders values (3,2,9)
select cast(((row_number() over( order by OrderNumber)) -1) /3 as int) as [Actual]
,*
from @orders
Actual Expected OrderNumber OrderDetailsNumber
----------- ----------- ----------- ------------------
0 0 1 1
0 0 1 2
0 0 1 3
1 1 1 4
1 2 2 5
1 2 2 6
2 2 2 7
2 3 2 8
2 3 2 9
答案 0 :(得分:0)
是的,经过几次编辑,我得到了最终答案:
SELECT DENSE_RANK() OVER (Order BY OrderNumber, floor(RowNumber/3)) - 1 AS Actual,
Expected,
OrderNumber,
OrderDetailsNumber
FROM
(
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY OrderNumber
ORDER BY OrderDetailsNumber
) - 1 AS RowNumber
FROM @Orders
) RowNumberTable
给出结果(带有额外的行进行测试):
Actual Expected OrderNumber OrderDetailsNumber
-------------------- ----------- ----------- ------------------
0 0 1 1
0 0 1 2
0 0 1 3
1 1 1 4
1 1 1 12
2 2 2 5
2 2 2 6
2 2 2 7
3 3 2 8
3 3 2 9
3 4 2 11
4 3 2 27
5 5 3 10
这仅适用于OrderDetailsNumber是唯一的,因此结果是确定性的。
我现在已经完成了完整的代码,但是对OrderDetailsNumber的依赖是非常不确定的,希望你可以根据需要进行测试和编辑。
我已经把高尔夫球打成了高尔夫'主要答案中的版本。
WITH FirstCTE AS
(
SELECT
OrderNumber,
OrderDetailsNumber,
Expected,
ROW_NUMBER() OVER (
PARTITION BY OrderNumber
ORDER BY OrderDetailsNumber
) - 1 AS RowNumber
FROM @Orders
)
, SecondCTE AS
(
SELECT OrderDetailsNumber as odn,
floor(RowNumber/3) as page_for_order_number,
DENSE_RANK() OVER (Order BY OrderNumber, floor(RowNumber/3)) - 1 AS Actual
FROM FirstCTE
)
SELECT c2.page_for_order_number,
c1.RowNumber,
C2.Actual,
c1.Expected,
c1.OrderNumber,
c1.OrderDetailsNumber
FROM FirstCTE AS c1
INNER JOIN SecondCTE AS c2
on c2.odn = c1.OrderDetailsNumber
答案 1 :(得分:0)
这让我觉得有点像黑客,但它有效...... 将row_number()除以3,并使用CEILING得到大于或等于该除法结果的最小整数。
select row_number() over( order by OrderNumber) as [Actual],
cast (row_number() over(order by ordernumber) as decimal(5,1)) / 3,
CEILING(cast (row_number() over(order by ordernumber) as decimal(5,1)) / 3)as GRPR,
*
from @orders
编辑:打它,永远不会得到结果排队。结果集中的第3列是您的“页码”。
产量:
Actual (No column name) PG_NBR Expected OrderNumber OrderDetailsNumber
1 0.333333 1 0 1 1
2 0.666666 1 0 1 2
3 1.000000 1 0 1 3
4 1.333333 2 1 1 4
5 1.666666 2 2 2 5
6 2.000000 2 2 2 6
7 2.333333 3 2 2 7
8 2.666666 3 3 2 8
9 3.000000 3 3 2 9