【问题标题】:I want to generate sql query that much similar like table of content我想生成与目录非常相似的 sql 查询
【发布时间】:2018-03-06 02:16:42
【问题描述】:

我们的情景是我想开发一个这样的 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 个数据,然后是三个具有相同页码的数据,如果“病房”编号更改,下一个 3 记录的页码将增加 1,并且下一个病房的程序相同换号

【问题讨论】:

  • 请正确格式化您的问题。很难看懂你的表。
  • 请编辑以显示您的输入数据和预期输出,您的描述难以理解。
  • 请查看附件图片
  • 输入输出为2,而你的图像只有1,是输入数据还是你预期的输出?如果是输入,那么您的预期输出是什么,反之亦然?
  • 假设它是一个表结构,现在我想在病房号更改等时增加下 3 条记录

标签: sql sql-server rdlc


【解决方案1】:

您希望以 3 条为一组对记录进行编号,但在换病房时还要增加编号,因此某些包可能仅包含 1 或 2 条记录。这很难。

要获得数字 1、1、1、2、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

【讨论】:

  • 这个查询给出了错误的数据,因为当病房改变开始这么大的数字为什么和查询计数从 2 开始而不是 1 为什么?
  • 我不明白你的意思。如果单击 rextester 链接,您会看到前三行得到 #1,接下来的三行是 #2,接下来是 #3(因为这是该病房的最后一行),然后是两行 #4(因为只有两个用于那个病房)等。对我来说看起来不错。这与您想要的有何不同?
【解决方案2】:

尝试使用其他示例数据并发布该示例数据以使其不起作用。

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

【讨论】:

    猜你喜欢
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多