我们的Senario是我想开发像这样的SQL查询
name address ward mobile pageno
A 00 1 9890 1
B 01 1 9890 1
C 01 1 9890 1
A1 10 1 9890 2
B1 101 1 9890 2
B 01 1 9890 2
A@ 00 1 9890 3
B# 01 1 9890 3
C^ 01 1 9890 3
A11 10 1 9890 4
B11 101 1 9890 4
B11 01 1 9890 4
这是我们目前的情况,并期待下面的检查
预期产出:
我希望这个结果是一堆3个数据具有相同的页码然后再三个数据具有相同的页码,如果“Ward”号码改变页码将增加1以用于下一个3记录并且程序对于下一个病房而言相同号码改变
答案 0 :(得分:0)
您希望以三个一包为您的记录编号,但也会增加病房更改的数量,因此有些包可能只包含1或2个记录。这很难。
要获得数字1,1,1,2,2,3,3,3等,您可以使用row_number
和整数除法。但是对于病房变更,您必须知道之前的单词计算的数字。在这里,您将不得不再次使用聚合和整数除法。由于聚合是指当前病房号码之前的病房号码,我们需要一个相关查询,我们将其应用于cross apply
:
select
name,
address,
ward,
mobile,
(row_number() over(partition by ward order by name) - 1) / 3 + 1 +
previous_wards_aggregated.pagenumbercount as pagenno
from mytable
cross apply
(
select coalesce(sum(ward_pagenumbercount), 0) as pagenumbercount
from
(
select ward, (count(*) - 1) / 3 + 1 as ward_pagenumbercount
from mytable before
where before.ward < mytable.ward
group by ward
) previous_wards
) previous_wards_aggregated
order by ward, name;
我已使用name
作为排序条件,因为您尚未指定任何标准。如果您需要其他订单,请更改此内容。
REXTESTER: http://rextester.com/QAASX4340
答案 1 :(得分:0)
尝试使用其他样本数据并发布样本数据,因为它不起作用。
DECLARE @Pageindex INT = 1 -- this is parameter that need to be pass in proc
DECLARE @Pagesize INT = 3 -- this is not parameter.it is inside proc
DECLARE @t TABLE (
NAME VARCHAR(50),addres VARCHAR(50)
,ward VARCHAR(50),mobile VARCHAR(50))
INSERT INTO @t
VALUES
('A ','00 ',1,'9890') ,('B ','01 ',1,'9890')
,('C ','01 ',1,'9890'),('A1 ','10 ',1,'9890')
,('B1 ','101',1,'9890') ,('B ','01 ',1,'9890')
,('A@ ','00 ',1,'9890') ,('B# ','01 ',1,'9890')
,('C^ ','01 ',1,'9890') ,('A11','10 ',1,'9890')
,('B11','101',1,'9890') ,('B11','01 ',2,'9890')
,('A22','10',2,'9890'),('B21','101 ',2,'9890')
,('B12','01 ',2,'9890') ,('ak1','10',4,'9890')
,('Bmm','01 ',4,'9890'),('B13','01 ',4,'9890')
;WITH CTE
AS (
SELECT *
--,DENSE_RANK()over(order by ward) rownum
,ROW_NUMBER() OVER (
ORDER BY ward
) rownum2
FROM @t
)
,CTE1
AS (
SELECT *
,CASE
WHEN (rownum2 % @Pagesize) = 0
THEN (rownum2 / cast(@Pagesize AS FLOAT))
ELSE CEILING((rownum2 / cast(@Pagesize AS FLOAT)))
END PageIndex
FROM cte c
)
SELECT NAME
,addres
,ward
,mobile
,PageIndex
FROM cte1