質問するログイン新規登録

Q&A

2回答

2599閲覧

SQLで作ったクエリの正しさを説明する方法

kakedashi_SE

総合スコア0

SQL

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

1クリップ

投稿2022/04/22 09:27

0

1

SQLの説明について
現在SQLで課題をやっています。
下記のシチュエーションと指示、クエリを踏まえて、
問題に対する回答を考えて頂きたいです。

【シチュエーション】
あるサイトでは、ユーザーの会員ランクを
「白金」「金」「銀」「銅」と分けている。
ある日、一部のユーザーがサイトにログインできない不具合が起き、
調査をしたところ、「白金」ユーザーは全員が不具合の対象で、
それ以外のランクのユーザーは一部が不具合の対象であった。
そのため、「白金」ユーザーのステータスと同じステータス状態にある、
「白金」ユーザー以外(「金」「銀」「銅」)をSQLのクエリで
抽出することになった。

【指示】
・テーブル名は「ユーザーランク」
・ユーザーIDとユーザー名を抽出。
・「白金」ユーザーは不具合対応済みなので、抽出してはいけない。

【作成したクエリ】
SELECT USERID, USERNAME FROM ユーザーランク
WHERE
STATUS IN (SELECT STATUS FROM ユーザーランク
WHERE GRADE='白金' )
AND
GRADE <> '白金'

【問題】
今回、客先から指示を貰い、このクエリを作成した。
しかし客先から「このデータは条件通りのデータか」という問い合わせが来たので、抽出したデータが正しい事を説明しなければならない。

条件:①客先は簡単なSQLしかわからない(今回使ったクエリは分からない)。
②必要であれば別のデータを抽出してもよい(複雑なクエリの場合は、
そのクエリの説明も必要となる)。
③必要であれば、LinuxコマンドやShellscript,Windowsアプリなどの
他のツールの使用も構わない。
④禁止事項:テーブル作成やデータの作成/更新/削除といった、
データベースへの改変。
⑤データ数が何件になっても対応ができる方法。

SQLで作ったクエリをLinuxに変換して説明する方法や、
CSVで出力してpowershellでfindする方法なども考えたのですが、
やり方が悪いのか上手く行かなくて…

以上なにとぞお願い致します。

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

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

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

68user

2022/04/22 09:41 編集

SELECT DISTINCT STATUS FROM ユーザーランク WHERE GRADE='白金' って具体的に何件返ってくるんですか? 数パターンしかない? 例えば xxx と yyy しかないなら、 SELECT USERID, USERNAME, STATUS, GRADE FROM ユーザーランク (以下同じ) として CSV にで吐き、その全行について STATUS が xxx か yyy であること、GRADE が白金でないことを調べてはどうですか?
kakedashi_SE

2022/04/22 09:51

4つのグレードの合計件数は50件で、 SELECT DISTINCT STATUS FROM ユーザーランク WHERE GRADE='白金' で返ってくるのは22件です。 今回は22件しかないので目視でもよいのですが、条件に 「⑤データ数が何件になっても対応ができる方法」とあるので、 データ数が何万件になっても対応できる方法を探しています。
kakedashi_SE

2022/04/22 09:53

すみません、22件=22パターン数と思ってください。 全50件のうち、重複しているステータスはいくつかありますが、 SELECT DISTINCT STATUS FROM ユーザーランク WHERE GRADE='白金' で返ってくるのは22パターンです。
68user

2022/04/22 10:17

では CSV の STATUS が 22件のいずれかであることを確認してはどうでしょうか。 > 「⑤データ数が何件になっても対応ができる方法」とあるので、 そんな夢のような仕様、真に受けなくていいんじゃないですか? すべてはコストとスケジュール見合いですよ。実際のところ必要なのは何件なんでしょうね。
68user

2022/04/22 10:23

例えば CSV に吐いて、 $ awk -F, '{print $3}' < xxx.csv | sort | uniq -c 2000000 xxxx 1000000 yyyy 1500000 zzzz .... で 22パターンであることがわかる。合計数は何億であり、CSV の行数と一致するので漏れがないことがわかる、など。あの SQL で妥当性を説明せよと言われると、awk・sort・uniq もダメかもしれませんけど。 わたしは納得してくれそうな Excel のフィルタ等がいいと思うんですけどね (最大 100万行ですけど)。
68user

2022/04/22 10:28

ああ、現実の問題ではなく課題ってことですね。
mather

2022/04/22 10:37

確認なのですが、もし学校の課題ならTeratailでは非推奨です。先生に質問しましょう。 https://teratail.com/help/avoid-asking もし実際にこのような状況に陥ったら、私の場合は「不安なことは何ですか?」「理解の難しいポイントがありますか?」と最初に聞くのですが…。
kakedashi_SE

2022/04/22 11:02

条件としてはWindows標準アプリなのでExcelは微妙なんですよね。 ExcelのVLOOKと似たことをPowershellでfindとかできないものなんでしょうか… matherさん>学校の課題ではありません。
mather

2022/04/22 11:22

> 学校の課題ではありません そうですか。 > やり方が悪いのか上手く行かなくて… 「上手く行かない」というのは具体的にどういうことでしょうか? 具体的な正解のある問題ではなさそうですので、どなたかが合格を出してくれないということでしょうか? 提出した回答にどのような評価がもらえたのか、具体的に記載するほうがより適切なアドバイスを貰えると思います。
winterboum

2022/04/22 14:34

matherさん、68userさんのがとても妥当に思えます。 なお、抽出が正しいか を検証するには 「抽出されたものがみな条件に合っている」 だけではだめで 「抽出漏れがない 」 ことも示す必要があります。
kakedashi_SE

2022/04/25 08:35

「抽出漏れがない」ことを示すために COUNTで数えたものをSUMしたいのですが、 クエリの書き方が分からず困ってしまっています、、 【不具合が起きていないユーザーの、STATUSごとの件数を 求めるクエリ】 SELECT STATUS , count(*) FROM ユーザーランク WHERE STATUS NOT IN (SELECT STATUS FROM ユーザーランク WHERE GRADE='白金' ) AND GRADE <> '白金' GROUP BY STATUS これを実行すると ステータス  CNT 754w8    4 dkq55    2 pkm43    2 といった具合にカウントされるのですが、 このカウントされた数の合計値を出すにはどうすればよいのでしょうか。
guest

回答2

0

「このカウントされた数の合計値を出すにはどうすればよいのでしょうか。」をSQLでやると相当ややこしくなりますので、「客先は簡単なSQLしかわからない」で問題でしょう。
この課題の嫌なところは「どのくらいのSQLならわかるの?」 というのが示されていないから厄介。
count はわかるかな、と思いますが group by は難しいでしょう、サブクエリがだめなのですから。

で、
「必要であれば、LinuxコマンドやShellscript,Windowsアプリなどの他のツールの使用も構わない。」
ということですから、そうしましょう。

awk、grep、sort. uniq などを使って。

投稿2022/04/26 03:51

winterboum

総合スコア23734

0

普通はテスト仕様書をかいて十分なテストデータを作成のうえテストし報告
その上でクライアントにテストさせ合格だったら納品という流れです。
ただし自らのテストで抜けていたチェック項目をクライアント側のテストで
発見されたらあなたのITスキルは極度に低いと判断されるので
足元を見られてそもそものベースの価格から下げさせられるかもしれませんし
あまりにひどい場合は、料金の支払いなしに契約を破棄されて
他者にのりかえられる可能性はあります
(おそらくリスクヘッジのためそういう契約条項が盛り込まれている)

投稿2022/04/25 01:06

yambejp

総合スコア118439

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.25%

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

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

質問する

関連した質問