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

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

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

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

Q&A

解決済

3回答

14842閲覧

count関数について (PostgreSQL)

sanezane

総合スコア91

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

0グッド

0クリップ

投稿2017/12/27 07:02

現在SQLを学んでいます。
count関数について画像右の【販売履歴テーブル】でなぜエラーになるのか理解ができません。教本には

「【商品区分】もgroup byによってグループ化しないと結果の行数が異なる(表がデコボコになる)」

と書いてありますが、わたしは逆に【商品区分】が2種類しかないのだからグループ化したら表がデコボコになってしまうのではないか、と頭の中で表をイメージしてしまいます。
実際に私の認識が間違っているワケでエラーもちゃんと出るのですが、理解ができません。
わかりやすくご教授お願いできますでしょうか。イメージ説明

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

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

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

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

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

guest

回答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
A.Ichi

総合スコア4070

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

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

sanezane

2017/12/28 00:26

RDBMS製品によってgroup byの機能が異なるのですね!勉強になります! 昨日問題をたくさん解いていて自分がgroup byの文法条件を誤って理解していることに気づきまして、おかげさまで理解しました。 【キーがユニークである】ということについて、RDBを見る際は意識して見ることにします!本当にありがとうございました!
guest

0

ベストアンサー

分かり難かったらごめんなさい。文書化って難しいです。

countというより、group byの考え方を出来るだけ簡単に説明します。
まずはエラーとならないSQLを提示してみましょう。

SQL

1Select 商品区分,count(*) as count from 商品履歴 group by 商品区分

この場合、結果としては

商品区分count
11
22

となるところは理解できますでしょうか?
これは、商品区分が同じものを分類してレコード数を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
ボーダーワンピース11
ビジネスバッグ21
布バッグ21
布バッグ31

ですし、

SQL

1Select MAX(商品区分),商品名,count(*) as count from 商品履歴 group by 商品名

であれば、

商品名商品区分count
ボーダーワンピース11
ビジネスバッグ21
布バッグ32

になります。

この様な回答で如何でしょうか?

表がデコボコ

このイメージがつかなかったので言及しませんでした。ごめんなさい。

投稿2017/12/27 07:21

motuo

総合スコア3027

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

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

sanezane

2017/12/27 08:34

とても丁寧に答えていただきましてありがとうございました。理解できました!説明しろと言われたら、正直言ってまだ厳しいので勉強を継続します!!
guest

0

商品区分, 商品名 毎に件数を取得したいのでしょうから、
GROUP BY にも
商品区分, 商品名
とします。

投稿2017/12/27 07:05

Orlofsky

総合スコア16415

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

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

sanezane

2017/12/27 08:35

ありがとうございました!理解できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問