2017-09-25 6 views
-3

の多くの類似したようなテーブルは、私たちのsenarioは、私はこの私はコンテンツ

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クエリを開発し、

期待

の下には、このチェックを期待したいということであることをSQLクエリを生成したいです出力:

output expected

は、私は再び同じPAを持つ3つのデータを同じページ番号を持つ3つのデータの束で、この結果が欲しいです「ワード」番号の変更の場合、次の3レコードでページ番号が1つ増えて、次のワード番号の変更に同じ手順が適用されます

+3

質問を適切に入力してください。あなたのテーブルを理解することは難しいです。 –

+0

あなたの入力データと予想される出力を表示するように編集してください。あなたの説明は分かりません。 –

+0

添付の画像をご確認ください –

答えて

0

3つのパックでレコードに番号を付けたい場合は、病棟の変更に伴い、一部のパックは1〜2個のレコードのみで構成されます。これは困難です。

番号1,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

このクエリーは間違ったデータを表示します。 –

+0

私はあなたが何を意味するかはわかりません。 rextesterリンクをクリックすると、最初の3行が#1、次の3行が#2、次の行が#3(その区画の最後の行であるため)、2行が#4その病棟には2つの病棟などがあります)。これはあなたが望むものとどのように違うのですか? –

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 
関連する問題