【その9】SQLserver!での連番の振り方を説明します!

【その9】SQLserver!での連番の振り方を説明します!

この記事を読むのに必要な時間は約 13 分です。

連番の振り方

先に同類の記事

実は連番の振り方自体は此方で説明しています。

SQLserverで連番をふる ROW_NUMBERの使い方を図解 RANK/DENSE_RANK
SQLサーバーのRownumberはちょっとだけ複雑ですが、その代わり細かい制御ができます。少なからずランキング系のデータを扱う事は度々あると思うので覚えておくと便利です。また、応用すれば 20~30みたいな指定も可能です。

内容が難しいのかな?(解析結果より)という感じなので意識的に

優しく解説

したいとおもいます!

基本はコピペだけで完成するようにしていきますね。

前半で環境構築、後半で連番の振り方を説明しています。

説明開始

テーブル作成

まずはテーブルを作りまーす。

CREATE TABLE [dbo].[food](
[種別] [nvarchar](50) NULL,
[名前] [nvarchar](50) NULL,
[グラム単価] [int] NULL
) ON [PRIMARY]
GO

実行するとこんな感じです。

テーブルを更新して左のペインに表示させます。

流し込み前の状態確認

テーブルを右クリックして上位1000行を選択し、今なにもデータが無い事を確認して見ます。

 

こんな感じでデータは 0 件ですね。

このまま進めても良いですが、キャッシュがちゃんと登録されていないため、赤波線がついています。

消します!

以前の記事でも紹介していますが

CTRL+SHIFT+R

です。

 

 

これが

CTRL+SHIFT+R

こうなります。

うまくいかなかったことは無いですが、もしどうしてもうまくいかない場合はコンソールだけ

再起動してください。

 

データの挿入(基本編)

以下のInsert文を流し込みます。

INSERT INTO [dbo].[food] VALUES ('お肉','牛','300')
INSERT INTO [dbo].[food] VALUES ('お肉','豚','120')
INSERT INTO [dbo].[food] VALUES ('お肉','羊','240')
INSERT INTO [dbo].[food] VALUES ('お肉','豆','50')
INSERT INTO [dbo].[food] VALUES ('お魚','いわし','200')
INSERT INTO [dbo].[food] VALUES ('お魚','いとう','250')
INSERT INTO [dbo].[food] VALUES ('お魚','さより','180')
INSERT INTO [dbo].[food] VALUES ('お魚','まだい','900')
INSERT INTO [dbo].[food] VALUES ('野菜','キャベツ','200')
INSERT INTO [dbo].[food] VALUES ('野菜','レタス','150')
INSERT INTO [dbo].[food] VALUES ('野菜','きゅうり','80')
INSERT INTO [dbo].[food] VALUES ('野菜','玉ねぎ','40')
INSERT INTO [dbo].[food] VALUES ('野菜','人参','25')
INSERT INTO [dbo].[food] VALUES ('野菜','ごぼう','45')
INSERT INTO [dbo].[food] VALUES ('野菜','にら','200')
INSERT INTO [dbo].[food] VALUES ('野菜','セロリ','210')

(1 行処理されました)と沢山表示されます。

データの挿入応用編(無視しても良いけどぜひ覚えて欲しい)

もし、データがExcelなどで既にあったり、Excelで作る方が早いと言う人はエクセルデータからコピペで登録できます。

普段やっている

上位1000行の表示

ではなく、

上位200行の編集

を行ってください。

この様な画面になります。

 

次に、エクセルで準備された以下のようなデータがあるとします。

コピペしたい人はこちらからどうぞ

種別 名前 グラム単価
お肉 300
お肉 120
お肉 240
お肉 50
お魚 いわし 200
お魚 いとう 250
お魚 さより 180
お魚 まだい 900
野菜 キャベツ 200
野菜 レタス 150
野菜 きゅうり 80
野菜 玉ねぎ 40
野菜 人参 25
野菜 ごぼう 45
野菜 にら 200
野菜 セロリ 210

ヘッダーを除いた部分のデータをコピーしてここの左側の

色が変わっている部分を選択して貼り付けます。

 

貼り付けるとこんな感じになります。

 

 

一度Selectして中身の確認

再度、上位1000行を表示してみるとデータが入っている事が確認できます。

連番を振る

作業開始前に画面を少しだけ成型

今回は出来るだけわかりやすくをテーマにしています。

SQL文の形を成型してみましょう。

Before

After

頭に★をつけてみました。カラム名は 無意味 です。

本当に無意味と言う意味ではなく、SQL文を各カラムで分解していく際に、【 , 】の処理を都度行うのを防ぐためです。※先頭行を足すと、どこかをコピペしてカンマを消して元々の先頭行にカンマをつけて・・・・ みたいな処理を防ぐために、あらかじめ先頭に無意味な列を追加し、最後にこの列と、次点の列の先頭カンマを消すようにします。カンマをカラム名の後ろに書く人なら無視して良いですが、管理人は頭にカンマをつける方が見やすいのでこの様なスタイルです。

 

 

一番基本的な連番の振り方

それでは連番を振っていきたいと思います。

連番を振る関数は Row_Number関数です。

単純にRow_Number関数を入れてみたいと思います。

/****** SSMS の SelectTopNRows コマンドのスクリプト  ******/
SELECT 
       '★' as '無意味'
	   -------------------------------
	  ,row_number() over(order by [種別]) as 'rownumber'
      ,[種別]
      ,[名前]
      ,[グラム単価]
  FROM [test001].[dbo].[food]

この様な形で連番を振ることができました。

応用として意味のある連番の振り方

次に、種別毎に連番を振りなおしたいと思います。

この ○○毎に を指定するのが Partition by です。

SQL文では以下の通りになります。

分かりやすくするために、ワザと元のrow_numberも残しています。

/****** SSMS の SelectTopNRows コマンドのスクリプト  ******/
SELECT 
       '★' as '無意味'
	   -------------------------------
	  ,row_number() over(order by [種別]) as 'rownumber'
	  ,row_number() over(Partition by [種別] order by [種別]) as 'rownumberPartitionby'
      ,[種別]
      ,[名前]
      ,[グラム単価]
  FROM [test001].[dbo].[food]

 

実行結果は以下の通りです。お魚とお肉、お肉と野菜の境目で連番が振りなおされているのが分かります。

 

ただし、これだと単純に連番が項番程度の意味しかないため、今度はグラム単価が小さな順序として表示します。 この○○が小さな順という指定を order by の部分で行います。

SQL文は以下の通りです。

/****** SSMS の SelectTopNRows コマンドのスクリプト  ******/
SELECT 
       '★' as '無意味'
	   -------------------------------
	  ,row_number() over(order by [グラム単価]) as 'rownumber'
	  ,row_number() over(Partition by [種別] order by [グラム単価]) as 'rownumberPartitionby'
      ,[種別]
      ,[名前]
      ,[グラム単価]
  FROM [test001].[dbo].[food]

二つのRow_Number関数のうち

  1.  partition byが無い為、トータルでの順位になっています。
  2.  partition byが有るため、種別ごとの順位になっています。

 

次に、小さい順番ではなく大きな順番で並び替えたいと思います。

これは簡単で order by 区の後ろに DESC をつけるだけです。

/****** SSMS の SelectTopNRows コマンドのスクリプト  ******/
SELECT 
       '★' as '無意味'
	   -------------------------------
	  ,row_number() over(order by [グラム単価] desc ) as 'rownumber'
	  ,row_number() over(Partition by [種別] order by [グラム単価] desc ) as 'rownumberPartitionby'
      ,[種別]
      ,[名前]
      ,[グラム単価]
  FROM [test001].[dbo].[food]

意図した通り、グラム単価が高い物順に変わりましたね。

 

[speech_bubble type=”drop” subtype=”L1″ icon=”02ukiyoe/yukiji_R.png” name=”ゆきじさん”]毎回これぐらい丁寧に書きなさい![/speech_bubble]

その他

その他記事へ誘導

row_numberの親せきで  rank と dense_rank があります。

使い方はほとんど一緒なので興味がある方は此方を参考にしてください。

SQLserverで連番をふる ROW_NUMBERの使い方を図解 RANK/DENSE_RANK
SQLサーバーのRownumberはちょっとだけ複雑ですが、その代わり細かい制御ができます。少なからずランキング系のデータを扱う事は度々あると思うので覚えておくと便利です。また、応用すれば 20~30みたいな指定も可能です。

 

 

 

 

 

タイトルとURLをコピーしました