SQLの勉強始めた初心者です
Q&A
解決したいこと
SQLの考え方を教えて下さい!
発生している問題・エラー
テーブルAにIDが重複なしで10個
テーブルBにID(重複あり)、名称、仕入れ額、販売額、店舗名を持っているとします。
各店舗からテーブルAに絞った利益を出す為のSQL文を教えて下さい!
Q&A
SQLの考え方を教えて下さい!
テーブルAにIDが重複なしで10個
テーブルBにID(重複あり)、名称、仕入れ額、販売額、店舗名を持っているとします。
各店舗からテーブルAに絞った利益を出す為のSQL文を教えて下さい!
DB サーバーが何かを書きましょう。(MySQL? SQL Server? PostgreSQL? Oracle?)
テーブル A, B の構造、データの例も詳しく書いてください。
「テーブルAに絞った利益」はどのように計算するのか詳しく書いてください。
自分ではどこまで SQL 文が書けていて、どこで躓いていて、何が分かれば解決できるかをかを、自分が書いた SQL 文を回答欄にアップして説明してください。丸投げは歓迎されません。
先に回答されている方に付け加える形で恐縮すが
現在の記載方法だと、ヘルプではなく
誰かが無給でボランティアで考えて教えてあげる(質問の意図も考えながら)という状況になってしまいます。
ご質問に以下を追加して頂けると幸いです。
・自身で環境を作って実施しているなら何のDBサーバーのSQLが知りたいのか?
→DBサーバーによって、書き方が異なるからです。もし、ただ問題があって、答えを知りたいとかの場合もそのように理由を書いてほしいです。
・どこまでは考えてみたのか?
→実際に試そうと思って躓いたギリギリまでのSQLも貼って質問してみましょう。
頑張ってはみたことが明示的になったほうが回答してもらえます。
・何がわからないのか?
→アドバイスするために、全てわからないのか?何がわからないのか?は追記されると回答しやすいです。
例えば全てわからないなら、何で勉強するといいよ等も回答できるためです。
@Data_beginner
Questioner
初めて質問するため色々配慮が足りてなくすいません。
サーバ:SQLサーバ
考えているコード
WITH base_table AS (
SELECT
a.id
AS id
,
ifnull(b.販売額
, 0) AS 販売額
,
ifnull(b.仕入れ額
, 0) AS 仕入れ額
FROM テーブルA a
LEFT OUTER JOIN テーブルB b
ON a.id
= b.id
),
group_table AS(
SELECT
id
, sum(販売額
), sum(仕入れ額
)
FROM base_table
GROUP BY id
,販売額
, 利益
)
-- ここまでで重複したIDに対する集計ができると考えています
-- 後は結果を登録します
INSETRT INTO result_table
group_table.id
AS id
,
group_table.販売額
- group_table.仕入れ額
AS 利益
FROM group_table;
疑問点:
テーブルAに対して店舗が複数あるので、店舗の数分GROUP BYを追加して
集計するしかないものでしょうか。
手元の参考書では1対1の関係での説明しかなく、考え方または参考サイトなどあれば教えてください。
質問者が回答欄に書くと、質問と回答がゴッチャになって訳が分からなくなりがちなので避けてください。上に書いたことは質問欄を編集して追記してください。その後でこのコメントは削除してください。
サーバ:SQLサーバ
それは何なのですか? Microsoft の SQL Server ? きちんと書きましょう。
上で私が聞いた以下の 2 点も質問欄に追記願います
テーブル A, B の構造、データの例も詳しく書いてください。
「テーブルAに絞った利益」はどのように計算するのか詳しく書いてください。
既に他の方が回答されているみたいなのでそちらは割愛させて頂いて、、
最初に質問の方法がわからない&経験者の洗礼をあびるのは未経験者にはよくあることなので、
心折れず頑張ってください。応援しております。
慣れてきたら、ミックさんの本がおすすめです。(SQLも慣れてくると転用できる書き方も多いので)←色々なSQLの書き方に対応してたはず。
https://www.amazon.co.jp/dp/4798115169
↑よければレビューをご覧になり、もし参考になりそうだったら購入してみてください。
@Data_beginner
Questioner
参考になりそうな書籍のお勧めありがとうございます!頂いているコメントの表示方法も分からなかったのでレス遅くなりました。もっと勉強しないと・・・
ご返信ありがとうございます!
誰もが最初は未経験です!
お互い頑張りましょう
質問文のテーブルA、テーブルBの項目定義は一般的に見て不自然であるため、そもそもテーブル設計を間違えている気がします。
各店舗からテーブルAに絞った利益を出す為のSQL文を教えて下さい!
意味が伝わりません。以下のような意味だと解釈して回答します。
・テーブルBのIDが、テーブルA内に存在するいずれかのIDであるレコードを抽出したい
・「販売額 - 仕入れ額」を利益として、テーブルAの店舗名ごとの利益の合計を算出したい
SELECT 店舗名
, SUM(販売額 - 仕入れ額) AS 利益
FROM テーブルB
WHERE ID IN (SELECT ID FROM テーブルA)
GROUP BY 店舗名
@Data_beginner
Questioner
解答ありがとうございます。推測していただいた通りです。
テーブルA テーブルB
ID:10、30、50 ID:10、20、30、40、50、10、20、30、40、50
テーブルAのIDを持つ店舗名とその利益の合計を算出したいと思っていました。
「WHERE ID IN (SELECT ID FROM テーブルA)」このような絞り方があるんですね。
勉強になりました。試してみます!
Select TbB.店舗名, sum(TbB.販売額)-sum(TbB.仕入額) as 利益 from TbA left join TbB on TbA.Id=TbB.Id group by TbB.店舗名
@Data_beginner
Questioner
正しく何をお伝えして助言頂けばいいかわからない中、推測&解答いただきありがとうございます!やはり考え方として1つ処理した後に店舗数分ループさせるのではなく、軸をテーブルBにして考えて、グループ化は店舗とすればいいんですね。試してみます!
That's great! Learning SQL is a strong step toward a career in data management, analytics, and software development. To gain practical experience and enhance your skills, consider applying for internships that focus on real-world database management.
247FreshInterns offers a variety of internship opportunities where you can work with databases, optimize queries, and understand how SQL is applied in professional environments. Hands-on experience will not only boost your confidence but also help you stand out to potential employers.
Check out 247FreshInterns.com today to find the right internship and take your SQL skills to the next level!