2017-09-25 1 views
-3

우리의 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 
[email protected]  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 

이 우리의 현재 상황과 같은 SQL 쿼리를 개발하고

아래이 체크 예상 예상 출력 :

output expected

내가 다시 같은 PA 세 가지 데이터를 같은 페이지 번호 3 개 데이터의 무리에서이 결과를 원하는 GE 번호와 ​​"병동"번호 변경 페이지 번호가 다음 3 개 레코드에 대해 1 씩 증가하고 다음 절차에 따라 다음 병동 번호 변경에 대해 동일하게 처리됩니다.

+3

질문의 형식을 올바르게 지정하십시오. 당신의 테이블을 이해하기가 어렵습니다. –

+0

입력 데이터와 예상 출력을 표시하도록 편집하십시오. 설명을 이해하기 어렵습니다. –

+0

첨부 된 이미지를 확인하십시오 –

답변

0

기록을 3 개 팩으로 번호를 지정하려면 병동이 변경되어 일부 팩은 1 또는 2 개의 레코드로만 구성 될 수 있습니다. 이건 어려워.

숫자 1, 1, 2, 2, 3, 3, 3 등을 얻으려면 row_number과 정수 나누기를 사용할 수 있습니다. 그러나 와드 변경을 위해서는 이전 단어가 몇 번째로 계산되었는지 알아야합니다. 여기에서는 집계 및 정수 나누기를 다시 사용해야합니다. 당신이 어떤을 지정하지 않은 것처럼, 내가 정렬 기준으로 name 사용했다

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; 

: 집계는 현재 병동 번호 이전 와드 번호를 의미, 우리는 우리가 cross apply에 적용 상관 쿼리를 필요 . 다른 주문이 필요한 경우에 대비하여 변경하십시오.

REXTESTER :http://rextester.com/QAASX4340

+0

이 쿼리는 잘못된 데이터를 제공합니다. 왜냐하면 와드가 이렇게 큰 숫자로 시작하는 이유와 쿼리 수가 2가 아닌 1에서 시작하기 때문입니다. 왜? –

+0

무슨 뜻인지 모르겠다. rextester 링크를 클릭하면 처음 세 행이 # 1, 다음 세 # 2, 다음 행이 # 3 (해당 구의 마지막 행이기 때문에), 두 # 4 그 와드를위한 두 사람). 나에게 잘 보입니다. 이게 당신이 원하는 것과 어떻게 다릅니 까? –

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') 
,('[email protected] ','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