我想生成类似于内容表

时间:2017-09-25 07:22:46

标签: sql sql-server rdlc

我们的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

这是我们目前的情况,并期待下面的检查

预期产出:

output expected

我希望这个结果是一堆3个数据具有相同的页码然后再三个数据具有相同的页码,如果“Ward”号码改变页码将增加1以用于下一个3记录并且程序对于下一个病房而言相同号码改变

2 个答案:

答案 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