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

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

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

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

Q&A

解決済

2回答

3785閲覧

【SQLの計算方法について】

star24star

総合スコア115

SQL

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

0グッド

0クリップ

投稿2015/11/12 10:55

■やりたいこと
=> 下記のような表を作成したい(SQL結果も下記のようになればいい)

|日付 |名前 |単価 |合計枚数 |割合 | |---- |---- |---- |---- |---- | |<day> |<name> |<price>|<count> |- | |20151201 |500円玉 |500 |1200 |11.2 | |20151201 |100円玉 |100 |3500 |32.7 | |20151201 |10円玉 |10 |6000 |56.0 |

・計算内容
1200 / 10700 => 11.2%
3500 / 10700 => 32.7%
6000 / 10700 => 56.0%

・情報
テーブル名
:payment_table
カラム
:上記表の<>がカラム名。カラムの中にキーなし
SQL
: 5.6.19

■現在迷っていること
=> 割合の求め方が分からない

SELECT day, name, price, round(SUM(total_price)/ ??? ,2) as wariai FROM payment_table GROUP BY ???

nameとpriceのカラム内にキーが無いため、どのように計算をすればいいのか分かりません。
(キーが無いと計算できないのではないか…?)
SQL内でなくても、結果的に表のようなものが出来れば良いのですが
出来ることならSQL内で完結させたいです。

分かる方がいらっしゃいましたらアドバイスを頂ければ幸いでございます。
宜しくお願い致します

...markdownの表が反映されなく見え辛くてごめんなさい!

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

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

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

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

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

KiyoshiMotoki

2015/11/12 10:57

お使いのデータベースの名前(MySQL、Oracle、SQL server、など)を記載して下さい。 それによって、解決方法が変わる可能性があります。
star24star

2015/11/12 11:17

抜けてました!mysql(co-mysql )です。
guest

回答2

0

ベストアンサー

情報の追記、ありがとうございます。

以下のSQL文で、いかがでしょうか?

sql

1SELECT 2 p.day, 3 p.name, 4 p.price, 5 p.count, 6 ROUND(p.count * 100 / tmp.total_price, 1) AS wariai 7FROM payment_table AS p, 8( 9 SELECT SUM(count) AS total_price FROM payment_table 10) AS tmp;

実行結果

sql

1mysql> CREATE TABLE `payment_table` ( 2 -> `day` int(11) DEFAULT NULL, 3 -> `name` varchar(32) DEFAULT NULL, 4 -> `price` int(11) DEFAULT NULL, 5 -> `count` int(11) DEFAULT NULL 6 -> ); 7Query OK, 0 rows affected (0.01 sec) 8 9mysql> INSERT INTO payment_table VALUES (20151201, '500円玉', 500, 1200), (20151201, '100円玉', 100, 3500), (20151201, '10円玉', 10, 6000); 10Query OK, 3 rows affected (0.00 sec) 11Records: 3 Duplicates: 0 Warnings: 0 12 13mysql> SELECT 14 -> p.day, 15 -> p.name, 16 -> p.price, 17 -> p.count, 18 -> ROUND(p.count * 100 / tmp.total_price, 1) AS wariai 19 -> FROM payment_table AS p, 20 -> ( 21 -> SELECT SUM(count) AS total_price FROM payment_table 22 -> ) AS tmp; 23+----------+---------+-------+-------+--------+ 24| day | name | price | count | wariai | 25+----------+---------+-------+-------+--------+ 26| 20151201 | 500円玉 | 500 | 1200 | 11.2 | 27| 20151201 | 100円玉 | 100 | 3500 | 32.7 | 28| 20151201 | 10円玉 | 10 | 6000 | 56.1 | 29+----------+---------+-------+-------+--------+ 303 rows in set (0.00 sec)

投稿2015/11/12 12:37

KiyoshiMotoki

総合スコア4791

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

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

hsk

2015/11/13 04:21 編集

こんにちは KiyoshiMotokiさんのコードでうまく表示されるので問題ないかと思います。 日付の値が複数存在していることも想定すれば(WHERE句で単一のdayの値に絞ったりしないとして)、 SELECT p.day, p.name, p.price, p.count, ROUND(p.count * 100 / tmp.total_price, 1) AS wariai FROM payment_table AS p, ( SELECT day, SUM(count) AS total_price FROM payment_table GROUP BY day ) AS tmp WHERE tmp.day = p.day; ですかね... 他のDBだと、副問い合わせ(サブクエリ)をせずに tmp.total_price の箇所を sum(count) over(partition by day) などと書けるものもありますね。
KiyoshiMotoki

2015/11/13 04:58

> 日付の値が複数存在していることも想定すれば そういうことは先におっしゃって下さいw 提示いただいたSQL文で問題ないかと思います。 あるいは、以下のようにテーブルの結合条件を明示的に記述しても良いと思います。 SELECT p.day, p.name, p.price, p.count, ROUND(p.count * 100 / tmp.total_price, 1) AS wariai FROM payment_table AS p INNER JOIN ( SELECT day, SUM(count) AS total_price FROM payment_table GROUP BY day ) AS tmp ON tmp.day = p.day;
star24star

2016/01/06 02:08

ご回答有難うございました!
guest

0

表示するだけの列は省略して、Oracle ですと、こんなところでしょうか?

SQL> column wariai format 990.0 SQL> select 2 pt.counts 3 , trunc(pt.counts / a.tot_counts * 100, 1) as wariai 4 from payment_table pt 5 , ( 6 select sum(p.counts) as tot_counts 7 from payment_table p 8 ) a 9 order by pt.price desc ; COUNTS WARIAI ------------- ------ 1200 11.2 3500 32.7 6000 56.0

なお、create table文とinsert文も提示していただけるとコメントし易いです。

投稿2015/11/12 11:29

編集2015/11/12 11:40
Orlofsky

総合スコア16415

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

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

star24star

2016/01/06 02:08

ご回答有難うございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問