質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

8290閲覧

[SQL]特定の文字コード領域を指定して文字の出現回数をランク付けする

masarusan24

総合スコア55

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2016/02/18 06:49

編集2016/02/18 07:15

【環境】
SQL Server 2014

【目的】
ある顧客情報が格納されているテーブル(仮にCUSTOMER_INFOとします)から、使用された人名外字の回数をランキングで取得したいと思っています。
人名外字は、下記のような特定の文字コード領域に割り当てられています。
(例:0x8440~0x844F)

【テーブル構成(仮)】
必要カラムのみ抜き出して簡略化してますがだいたいこんな感じです。

[ORDER_NO] [char](13) NOT NULL, [FAMILY_NAME] [varchar](20) NULL, -- 姓 [FIRST_NAME] [varchar](20) NULL -- 名

【期待する結果(例)】

1 , 髙, 100
2 , 﨑, 99
3 , 邉, 80

10, 齋, 20

下記SQLで指定文字の出現数を数えることは出来ると思うのですが、この方法だと外字の個数分だけの行数を書くことになってしまい、あまりスマートではないと思っています。

SQL

1--例「あ」~「お」までの出現数を数える 2SELECT 3 SUM(LEN(FAMILY_NAME) - LEN(REPLACE(FAMILY_NAME, 'あ', ''))) 4 + SUM(LEN(FIRST_NAME) - LEN(REPLACE(FIRST_NAME, 'あ', ''))) AS 'あ', 5 SUM(LEN(FAMILY_NAME) - LEN(REPLACE(FAMILY_NAME, 'い', ''))) 6 + SUM(LEN(FIRST_NAME) - LEN(REPLACE(FIRST_NAME, 'い', '')))AS 'い', 7 SUM(LEN(FAMILY_NAME) - LEN(REPLACE(FAMILY_NAME, 'う', ''))) 8 + SUM(LEN(FIRST_NAME) - LEN(REPLACE(FIRST_NAME, 'う', ''))) AS 'う', 9 SUM(LEN(FAMILY_NAME) - LEN(REPLACE(FAMILY_NAME, 'え', ''))) 10 + SUM(LEN(FIRST_NAME) - LEN(REPLACE(FIRST_NAME, 'え', ''))) AS 'え', 11 SUM(LEN(FAMILY_NAME) - LEN(REPLACE(FAMILY_NAME, 'お', ''))) 12 + SUM(LEN(FIRST_NAME) - LEN(REPLACE(FIRST_NAME, 'お', ''))) AS 'お' 13FROM CUSTOMER_INFO

特定の文字コード領域を指定して出現回数をカウントするための、他のうまい方法があるようでしたら情報いただけるとありがたいです。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ぱっと思いついた方法です。

別にすべての外字を格納するテーブルを作ることができるなら以下のようにすれば希望しているものが作れそうです。

外字格納用テーブル

SQL

1CREATE TABLE [dbo].[external_character] ( 2 chara varchar(2) NOT NULL 3);

ここに集計対象の外字を流し込んでおきます。

集計用クエリ

SQL

1SELECT 2RANK() OVER(ORDER BY COUNT(*) DESC) AS ランキング, 3external_character.chara 文字, 4COUNT(*) AS 出現数 5FROM external_character, CUSTOMER_INFO 6WHERE (CUSTOMER_INFO.FAMILY_NAME + CUSTOMER_INFO.FIRST_NAME) LIKE ('%' + external_character.chara + '%') 7GROUP BY external_character.chara

※一つのレコードに同じ外字が複数回入ってくることを考慮していません。
※RANK()はSQL2005以降です。
※重たいかもしれません。レコード数次第。

投稿2016/02/18 10:46

編集2016/02/18 10:48
dupont_kedama

総合スコア925

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masarusan24

2016/02/19 02:39

ご回答ありがとうございます。 RANK()関数は初めて知りました。 本番稼働中のシステムなのでテーブルの新規作成は出来ませんでしたが、現在未使用で近しい構成のテーブルがありましたので、そちらにデータを投入して試したところ期待通りの結果を得ることができました。 勉強になりました。 ありがとうございます!
dupont_kedama

2016/02/19 06:36

qiitaの投稿については特に問題ありませんが、自分で書いた内容について指摘します。 まず、集計用SQL文で「external_character.chara 文字」としていますが他の列と同様に「external_character.chara AS 文字」とした方がよいですね。 それから「external_character」テーブルのDDLでインデックスを定義していません。同じ文字が入るのを許さない方がよいので、主キーにしてしまうか、せめてユニークインデックスをつけるべきでした。
masarusan24

2016/02/19 07:04

確かにそのとおりですね。 ご指摘ありがとうございます。 該当箇所を修正しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問