現在SQLを学んでいます。
count関数について画像右の【販売履歴テーブル】でなぜエラーになるのか理解ができません。教本には
「【商品区分】もgroup byによってグループ化しないと結果の行数が異なる(表がデコボコになる)」
と書いてありますが、わたしは逆に【商品区分】が2種類しかないのだからグループ化したら表がデコボコになってしまうのではないか、と頭の中で表をイメージしてしまいます。
実際に私の認識が間違っているワケでエラーもちゃんと出るのですが、理解ができません。
わかりやすくご教授お願いできますでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
下記の2つの項目は分けて考えてはどうでしょうか
(1)count関数について画像右の【販売履歴テーブル】でなぜエラーになるのか理解ができません。
(2)【商品区分】もgroup byによってグループ化しないと結果の行数が異なる(表がデコボコになる)
まずは(1)のエラーになるのは、SQL文法としてgroup by機能ではselect区の項目と一致する事をPostgresでは前提としているのでエラーになります。ですがMySqlではエラーになりません。商品区分のどれか一つが選ばれます。
次に(2)の結果の桁数が異なるのは、データベース設計上、同じ商品名が他の商品区分に存在する可能性が有ると言っています。この場合、商品区分を「被服」、「服飾」に分けているのでしょか、同じ商品名が跨って存在しているのかも。
例えば、商品マスタの商品名は複数有得てユニークでないと考られる場合、商品マスタは、商品区分と商品名でユニークとする様します。そうであれば商品履歴の件数集計は、商品区分を含む事になります。
sql
1select 商品区分, 商品名, count(*) from 商品履歴 group by 商品区分,商品名;
RDBの場合、キーがユニークで有るか否かがとても重要な設計要素です。これを良く読み間違えて苦労する事が多々有ります(俺だけ?)。
投稿2017/12/28 00:00
編集2017/12/28 00:04総合スコア4070
0
ベストアンサー
分かり難かったらごめんなさい。文書化って難しいです。
countというより、group by
の考え方を出来るだけ簡単に説明します。
まずはエラーとならないSQLを提示してみましょう。
SQL
1Select 商品区分,count(*) as count from 商品履歴 group by 商品区分
この場合、結果としては
商品区分 | count |
---|---|
1 | 1 |
2 | 2 |
となるところは理解できますでしょうか?
これは、商品区分が同じものを分類してレコード数をcountして下さい、という命令になります。
よって、商品区分が1の場合はレコード数が1件なのでcountが1に、2の場合は2件のレコードがあるのでcountは2になります。
次にエラーとならないSQLその2です。
SQL
1Select 商品名,count(*) as count from 商品履歴 group by 商品名
この場合、結果としては
商品名 | count |
---|---|
ボーダーワンピース | 1 |
ビジネスバッグ | 1 |
布バッグ | 1 |
となります。この場合、商品名が異なるレコードが1件ずつ、合計3件あるのでこの様な表示になります。
では、質問者様の書かれているSQLを改めて見てみましょう。
SQL
1Select 商品区分,商品名,count(*) as count from 商品履歴 group by 商品名
敢えて言葉にするならば、商品名が同じ物を纏めてレコード数と商品区分を出す、となります。
この場合、商品区分はどの様に表示できるでしょうか?
上記のデータの例にはありませんでしたが、下記の様なデータ構成になっていたらどう出しますか?
商品名 | 商品区分 |
---|---|
ボーダーワンピース | 1 |
ビジネスバッグ | 2 |
布バッグ | 2 |
布バッグ | 3 |
この場合、布バッグが問題となります。システムは商品名が同じものを纏めるまでは分かるですが、商品区分をどう出すべきかは判断できなくなってしまってます。(商品区分を出すべき?合計すべき?最大の数を出すべき?等々)
よって、システムにはどう出すべきか教えてあげる必要があるのです。
例えば…
SQL
1Select 商品区分,商品名,count(*) as count from 商品履歴 group by 商品区分,商品名
であれば、
商品名 | 商品区分 | count |
---|---|---|
ボーダーワンピース | 1 | 1 |
ビジネスバッグ | 2 | 1 |
布バッグ | 2 | 1 |
布バッグ | 3 | 1 |
ですし、
SQL
1Select MAX(商品区分),商品名,count(*) as count from 商品履歴 group by 商品名
であれば、
商品名 | 商品区分 | count |
---|---|---|
ボーダーワンピース | 1 | 1 |
ビジネスバッグ | 2 | 1 |
布バッグ | 3 | 2 |
になります。
この様な回答で如何でしょうか?
表がデコボコ
このイメージがつかなかったので言及しませんでした。ごめんなさい。
投稿2017/12/27 07:21
総合スコア3027
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/28 00:26