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

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

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

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

Q&A

解決済

2回答

256閲覧

SQLで条件を使い、割合を出したい。

caprice512

総合スコア8

SQL

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

0グッド

0クリップ

投稿2019/06/11 05:11

編集2019/06/11 05:48

SQLを使用し、下記①~③を割り出したいのですが、可能でしょうか。
不可能でしたらプログラムで作成しようと思います。
使用DB:ACCESS SQLクライアント:CSE

①初回でサンプルを買う人(初回のうち〇%) 
②初回から現品を買う人(初回のうち〇%) 
③サンプルから現品に至る人(サンプル買った人のうち〇%)

テーブルA

売上ID、受注日、名前、商品名、
10001 2019-05-01 鈴木 AAAAAサンプル
10001 2019-05-01 鈴木 BBBBBBB
10002 2019-05-05 佐藤 DDDDDDD
10003 2019-06-12 井上 DDDDDDD
10003 2019-06-12 井上 EEEEEサンプル
10004 2019-07-10 田中 CCCCCサンプル
10004 2019-07-10 田中 EEEEEサンプル
10004 2019-07-10 田中 GGGGGGG
:::

※「サンプル」と記載がないものが現品とする。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/06/11 05:17

DB サーバーは何ですか? SQL Server? MySQL? Oracle? その他? SQL はサーバーによって異なります(方言的なものですが)。SQL の質問をするならサーバーが何かを書きましょう。
caprice512

2019/06/11 05:28

ありがとうございます。 ACCESSになります。SQLクライアントはCSEを使用しています。 宜しくお願い致します。
退会済みユーザー

退会済みユーザー

2019/06/11 05:35

それを質問を編集してなるべく質問文で目立つ場所に追記していただければと思います。
caprice512

2019/06/11 05:49

追記させていただきました。 宜しくお願い致します。
sazi

2019/06/11 06:05

同じ商品のサンプル/現品を識別する情報は無いのですか? 商品名から、現品とその現品のサンプルを識別するのは面倒ですよ。
caprice512

2019/06/11 06:11

ありがとうございます。 元データがその様になってしまっておりまして、 変更ができない形となっております。 宜しくお願い致します。
guest

回答2

0

ベストアンサー

先ずは現品とサンプルを結びつける情報のクエリーを作成します。
[Q_商品名リスト]

SQL

1select replace(商品名, 'サンプル', '') as 商品名グループ 2 , (商品名 like '*サンプル*') as サンプル, 商品名 3from テーブルA 4group by replace(商品名, 'サンプル', ''), (商品名 like '*サンプル*'), 商品名

以下は上記を元にした件数です。商品ごとの初回購入件数は①+②です。

①初回でサンプルを買う人

SQL

1select 商品名グループ, count(*) 2from テーブルA ta inner join Q_商品名リスト q1 on ta.商品名=q1.商品名 3where 受注日=(select min(受注日) from テーブルA where 名前=ta.名前) 4 and サンプル 5group by 商品名グループ

②初回から現品を買う人

SQL

1select ta.商品名, count(*) 2from テーブルA ta inner join Q_商品名リスト q1 on ta.商品名=q1.商品名 3where 受注日=(select min(受注日) from テーブルA where 名前=ta.名前) 4 and Not サンプル 5group by ta.商品名

③サンプルから現品に至る人

SQl

1select 商品名グループ, count(*) 2from テーブルA ta inner join Q_商品名リスト q1 on ta.商品名=q1.商品名 3where 受注日=(select min(受注日) from テーブルA where 名前=ta.名前) 4 and サンプル 5 and exists(select 1 from テーブルA where 名前=ta.名前 and 商品名=q1.商品名グループ) 6group by 商品名グループ

正規化もされていないですし、遅いのは覚悟して下さい。
件数次第では安定しないかもしれません。
その際はQ_商品名リストを元にテーブルにした方が安定するでしょうし、多少早くなるかと思います。

投稿2019/06/11 07:10

編集2019/06/11 07:16
sazi

総合スコア25195

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

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

caprice512

2019/06/11 07:31

ありがとうございました!! 1つ1つ確認して、しっかり学ばせていただきます。 大変お手数をおかけいたしました。
guest

0

初回とはなにかという定義によります

  • 同じ売上IDであれば全部初回なのか
  • 最初のものだけが初回なのか

が、わかりません。SQLの場合レコードの順番というのはあてにならないので
後者の場合は別途順番を確定するためのカラムが必要です

  • 商品名の「サンプル」という文字も末尾にしかつかないのか
  • 先頭や途中にもつくのか

で、書き方がかわってきます
もしちゃんと管理したいなら、サンプルカラムをつくってそのon/offで
きちんとサンプルかどうか判別できるようにしたほうが効率的です

sample

アクセスと書式が違ったらうまく読み替えてください

SQL

1create table tbl(pid int primary key auto_increment,売上ID int,受注日 date,名前 varchar(20),商品名 varchar(30)); 2insert into tbl(売上ID,受注日,名前,商品名) values 3(10001,'2019-05-01','鈴木','AAAAAサンプル'), 4(10001,'2019-05-01','鈴木','BBBBBBB'), 5(10002,'2019-05-05','佐藤','DDDDDDD'), 6(10003,'2019-06-12','井上','DDDDDDD'), 7(10003,'2019-06-12','井上','EEEEEサンプル'), 8(10004,'2019-07-10','田中','CCCCCサンプル'), 9(10004,'2019-07-10','田中','EEEEEサンプル'), 10(10004,'2019-07-10','田中','GGGGGGG'), 11(10005,'2019-07-10','吉田','HHHHサンプル'), 12(10011,'2019-05-11','鈴木','XXXXXX'), 13(10012,'2019-06-05','佐藤','YYYYYサンプル');
  • 初回にサンプルを買った人

SQL

1select * from ( 2select 売上ID,名前,sum(case when 商品名 LIKE '%サンプル%' then 1 else 0 end) as flg 3from tbl 4group by 売上ID,名前 5) as t1 6where not exists( 7select 売上ID,名前,sum(case when 商品名 LIKE '%サンプル%' then 1 else 0 end) as flg 8from tbl 9group by 売上ID,名前 10having 名前=t1.名前 and 売上ID<t1.売上ID 11) 12and flg>0
  • 初回に現品を買った人

SQL

1select * from ( 2select 売上ID,名前,sum(case when NOT 商品名 LIKE '%サンプル%' then 1 else 0 end) as flg 3from tbl 4group by 売上ID,名前 5) as t1 6where not exists( 7select 売上ID,名前,sum(case when NOT 商品名 LIKE '%サンプル%' then 1 else 0 end) as flg 8from tbl 9group by 売上ID,名前 10having 名前=t1.名前 and 売上ID<t1.売上ID 11) 12and flg>0 13
  • サンプルから現品に至る人

ちょっと意味がわからない

投稿2019/06/11 06:20

編集2019/06/11 07:20
yambejp

総合スコア114843

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

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

caprice512

2019/06/11 06:32

わかりにくく申し訳ありません。 同じ売上IDであれば全部初回となります。 商品名の「サンプル」という文字は末尾以外にも途中にもつくことがあります。 元データがこの様になっており、ややこしく申し訳ありません。
caprice512

2019/06/11 07:34

ありがとうございました!! 1つ1つ確認して、しっかり学ばせていただきます。 大変お手数をおかけいたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問