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

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

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

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

Q&A

解決済

2回答

169閲覧

progate SQL問題について

Iroha

総合スコア2

SQL

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

0グッド

0クリップ

投稿2024/10/08 08:02

お世話になっております。
最近サーバーエンドを学習しているプログラミング初心者です。

今回SQLをProgateで学習していて、その中でどうしても腑に落ちない模範解答があり、なぜそのような回答になるのか教えていただきたいです。

つまずいている場所はSQL道場の6番目の問題で、
前提として、DBのテーブルおよびカラムの内容は以下の通りです。

【★sales_recordsテーブル】
→【idカラム】【user_idカラム】【item_idカラム】【perchased_atカラム】
引用テキスト
【★itemsテーブル】
→【idカラム】【nameカラム】【priceカラム】【costカラム】

このテーブルを使って出題された問題は

このサイトの
・総売上(売れた商品の値段の合計)
・総利益(売れた商品の利益の合計)
を取得してください。
また、取得した値にはASを用いて、それぞれ
総売上

総利益
と名前を付けてください。

でした。

この回答が

SQL

1SELECT SUM(items.price) AS "総売上", SUM(items.price - items.cost) AS "総利益" 2FROM sales_records 3JOIN items 4ON sales_records.item_id = items.id; 5

だったのですが、これだと単に各商品の価格を足し算しているだけで、購入された回数など度外視しているので総売り上げにはならないのではないかと思っています。

私としては

SQL

1SELECT count(item_id) 2FROM sales_records 3GROUP BY item_id

↑にて、ある商品が何回購入されているのかを計算した後、その数を価格を掛け算したものが総売り上げになるのではないかと思っています。

説明がややこしくて申し訳ありませんが、なぜこの考えではだめなのかを教えていただけると幸いです。

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

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

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

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

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

TakaiY

2024/10/08 08:22 編集

sales_recordsテーブルには売り上げごとにレコードが作られるのだと思いますが、 レコードに「個数」のカラムが無いということは、1つを指していると思っていいでしょうか。
Iroha

2024/10/08 08:27

こんにちは、ご質問ありがとうございます。 個数のカラムがないので、一つのデータごとに一個の売り上げデータということになります。 なので、該当のitem_idの数をまずカウントしなきゃいけないのかな、と思った次第です・・・ (わかりづらくてごめんなさい(´;ω;`)
sk.exe

2024/10/08 08:50

> 前提として、DBのテーブルおよびカラムの内容は以下の通りです。 各テーブルの役割、各列の意味およびデータ型を具体的に明記されることをお奨めします。 > これだと単に各商品の価格を足し算しているだけで、購入された回数など > 度外視しているので総売り上げにはならないのではないかと思っています。 仮にテーブル[items]が商品マスタ(1側)、テーブル[sales_records]が販売履歴(多側)に相当するとして、[sales_records]に定義されている列は本当にその4つしかないのでしょうか。 もしそうなのであれば、[sales_records]に記録されているレコードから分かるのは、 ・「いつ」 -> [perchased_at]列に記録されている日時 ・「誰が」 -> [user_id]列に記録されているユーザーID ・「何の商品を」 -> [item_id]列に記録されている商品ID の 3 つの要素が ・「どの順番で記録されたか」 -> [id]列に記録されているレコード番号 までです。 「販売個数」を示す列が定義されていないため、[item_id]が示す商品を「何個」売ったかまでは判りません。 その場合、暗黙的に「[item_id]が示す商品を『1個』売ったこと」が1つのレコードに記録されているものと解釈するしかありません。 > ある商品が何回購入されているのかを計算した後、その数を > 価格を掛け算したものが総売り上げになるのではないかと思っています。 > GROUP BY item_id 「『全ての』売上の合計と利益の合計を求めよ」と「『商品ごとに』売上の合計と利益の合計を求めよ」では意味が異なります。この場合は前者のはず。 上記の解釈で間違いないのであれば、模範解答の通りのSQLを記述することになるでしょう。
Iroha

2024/10/08 09:55

質問する時はデータ型を書くといいんですね!勉強になります! 何の解答を求められてるかのはきちがいをしているかもとのこと、なるほどです。 ご丁寧にありがとうございます! 今後質問するときはいただいたアドバイスを頭に入れて質問したいと思います! 本当にありがとうございました!
guest

回答2

0

ベストアンサー

個数を求めてから、総売上と総利益を計算しても、同じ結果は求めれるとは思いますが、以下の理由により、不正解となります。
・売り上げ個数は求められていないので計算は不要
・個数で掛け算をする代わりに個数分の足し算をしても同一結果となる
・個数を求めてから金額計算をする場合、SQLが複雑化する

なお、コンピュータは、人間と違って、掛け算より、その分の足し算をするほうが得意だったりします。

投稿2024/10/08 09:20

YT0014

総合スコア1719

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

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

Iroha

2024/10/08 09:53

たしかに不要な計算は取り除きたいですね! 不正解な理由が明確にわかってすっきりしました! ややこしい説明の中ご丁寧で的確なご回答をありがとうございました!
guest

0

SQL詳しくないですが、コメントしたので書いてみます。

Joinしたので、以下のようなカラムを持つテーブルができます

text

1【idカラム】【user_idカラム】【item_idカラム】【perchased_atカラム】【nameカラム】【priceカラム】【costカラム】

このテーブルは商品1つ売れるごとに1レコードできるなので、全てのレコードの価格を合計すると売上が出ます。
それをSQLにしたものが以下の表現です。

text

1SUM(items.price)

投稿2024/10/08 08:43

TakaiY

総合スコア13584

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問