この記事を読むのに必要な時間は約 13 分です。
連番の振り方
先に同類の記事
実は連番の振り方自体は此方で説明しています。
内容が難しいのかな?(解析結果より)という感じなので意識的に
したいとおもいます!
基本はコピペだけで完成するようにしていきますね。
前半で環境構築、後半で連番の振り方を説明しています。
説明開始
テーブル作成
まずはテーブルを作りまーす。
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で作る方が早いと言う人はエクセルデータからコピペで登録できます。
普段やっている
ではなく、
を行ってください。
この様な画面になります。
次に、エクセルで準備された以下のようなデータがあるとします。
コピペしたい人はこちらからどうぞ
種別 | 名前 | グラム単価 |
お肉 | 牛 | 300 |
お肉 | 豚 | 120 |
お肉 | 羊 | 240 |
お肉 | 豆 | 50 |
お魚 | いわし | 200 |
お魚 | いとう | 250 |
お魚 | さより | 180 |
お魚 | まだい | 900 |
野菜 | キャベツ | 200 |
野菜 | レタス | 150 |
野菜 | きゅうり | 80 |
野菜 | 玉ねぎ | 40 |
野菜 | 人参 | 25 |
野菜 | ごぼう | 45 |
野菜 | にら | 200 |
野菜 | セロリ | 210 |
ヘッダーを除いた部分のデータをコピーしてここの左側の
色が変わっている部分を選択して貼り付けます。
貼り付けるとこんな感じになります。
一度Selectして中身の確認
再度、上位1000行を表示してみるとデータが入っている事が確認できます。
連番を振る
作業開始前に画面を少しだけ成型
今回は出来るだけわかりやすくをテーマにしています。
SQL文の形を成型してみましょう。
Before
After
頭に★をつけてみました。カラム名は 無意味 です。
一番基本的な連番の振り方
それでは連番を振っていきたいと思います。
連番を振る関数は 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関数のうち
- partition byが無い為、トータルでの順位になっています。
- 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 があります。
使い方はほとんど一緒なので興味がある方は此方を参考にしてください。