人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

(データベース)SQL 上で、売り上げに動的に重みを加味しながら集計することはできるでしょうか?
初投稿です。現在、次のようなテーブルが既に存在している状態だとします。(便宜上非正規形にしています)

<注文>
注文番号 (PK), 担当者, 売り上げ
1, 田中, ¥2,000
2, 山田, ¥3,000

ここで、¥4,000 の佐藤さんと山田さんで担当を行った注文3が入り、売り上げを2人で半分ずつ分ける必要が生じたとします。
(注文を分割してあたかも佐藤さんと山田さんそれぞれに注文があったように見せかけるのはできないものとします)
同じ注文に対して2人以上の担当をつけられないため、次のように構成を拡張しました。

<注文>
注文番号 (PK), 売り上げ
1, ¥2,000
2, ¥3,000
3, ¥4,000

<売り上げ>
注文番号 (PK), 担当者 (PK), 重み
1, 田中, 100%
2, 山田, 100%
3, 佐藤, 50%
3, 山田, 50%

ですが、今度は SQL の SUM 句で担当者ごとの売り上げ集計ができなくなってしまいました。
例えば山田さんは注文2の ¥3,000 と注文3の ¥4,000 × 50% の ¥2,000 を合計して
売り上げ ¥5,000 と出したいのですが、このような重み付けを加味した集計を SQL クエリだけで行うことは可能でしょうか?

●質問者: quesit
●カテゴリ:コンピュータ インターネット
✍キーワード:PK SQL いもの クエリ データベース
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● y-kawaz
●35ポイント

↓こんなテーブルがある感じですよね

# SELECT * FROM 注文;
 注文番号 | 売り上げ
----------+----------
 1 | 2000
 2 | 3000
 3 | 4000
(3 rows)

# SELECT * FROM 売り上げ;
 注文番号 | 担当者 | 重み
----------+--------+------
 1 | 田中 | 1
 2 | 山田 | 1
 3 | 佐藤 | 0.5
 3 | 山田 | 0.5
(4 rows)

↓これでどうでしょう?

# SELECT 担当者, SUM(売り上げ * 重み) FROM 売り上げ, 注文 WHERE 売り上げ.注文番号 = 注文.注文番号 GROUP BY 担当者;
 担当者 | sum
--------+------
 山田 | 5000
 佐藤 | 2000
 田中 | 2000
(3 rows)
◎質問者からの返答

SUM 句内で乗算を使用することができたんですね…参考になります。

SQL は他の言語に比べて「そんな書き方できるんだ!」っていうことが多くて大変です。。

回答ありがとうございました!


2 ● うぃんど
●40ポイント ベストアンサー

比較的環境を選ばない方法を書きますが、環境によって全角文字はそのままでは使えない場合(`や"で囲む必要があったりします)もあります

SELECT 売り上げ.担当者, SUM(注文.売り上げ * 売り上げ.重み) AS 売り上げ
FROM 売り上げ
LEFT JOIN 注文 ON 注文.注文番号 = 売り上げ.注文番号
GROUP BY 売り上げ.担当者

売り上げテーブルの重みフィールドは50%などの文字列ではなく0.5といった数値が入っているものとしています

SQLは完全な共通語ではなくRDBMSによって大きな違いがあったりもしますので、SQLとせずに必ずRDBMS名(MySQL?PostgreSQL?Access?SQLServer?ORACLE?・・・?)とバージョンを記述するクセをつけておくようにしましょう

また、人力検索で質問する際には「回答受付中もコメント・トラックバックを表示する」の欄にチェックを入れておくと細かなやりとりが出来て便利なので、出来ればチェックを入れておいてください

◎質問者からの返答

SUM 句で乗算は利用できたんですね。なるほど。

SQL 環境の記述については、個人的に使っている MySQL と仕事の SQL Server が使えるため、

できるだけ環境に依存しない方法が知りたかったので、あえて曖昧にしたのですが、だったらそう書いておくべきでしたね。

あと、今からでも設定を変更できたので、「回答受付中もコメント・トラックバックを表示する」のチェックを入れておきました。

まだ人力はてな初心者でよくわからないことも多いですので、調べてみることにします!

親切なアドバイス・回答ありがとうございました!

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ