- ベストアンサー
簡単なテーブルの集計方法
- 3つのテーブルから指定したユーザーの指定月のアクセス日時と売上げ金額を集計する方法を解説します。
- SELECT文を使用して、ユーザー情報テーブル、アクセスログテーブル、売上げ金額テーブルを結合し、指定したユーザーの指定月のアクセス数と売上げ金額を取得します。
- 集計結果の表は、id、username、date、access、salesの5つのカラムで構成されます。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
SELECT s.user_id AS id ,username ,a.ip ,a.`date` ,access ,sales FROM ( SELECT user_id ,ip ,COUNT(ip) AS access ,DATE(created_at) AS `date` FROM access_log WHERE YEAR(created_at)=2010 AND MONTH(created_at)=11 GROUP BY user_id, `date`, ip ) AS a LEFT JOIN ( SELECT user_id ,SUM(amount) AS sales ,DATE(created_at) AS `date` FROM sales WHERE YEAR(created_at)=2010 AND MONTH(created_at)=11 GROUP BY user_id, `date` ) AS s ON a.user_id=s.user_id AND a.`date`=s.`date` JOIN user AS u ON a.user_id=u.id view 作ってしまいたい気分だ。 何か引っかかるけどまぁいい。アクセスとセールスっておそらく一連の流れだから、まとめてしまってもいんじゃない。
その他の回答 (3)
- yambejp
- ベストアンサー率51% (3827/7415)
>10000円ですね で、よければたとえばこんな感じでいけます。 (元テーブルの正規化が微妙な気がしますが) select user.id , user.username, sub1.date , access , sales from( select user_id,date(created_at) as date ,count(*) as access from access_log group by user_id,date) as sub1 inner join ( select user_id,date(created_at) as date ,sum(amount) as sales from sales group by user_id,date ) as sub2 on sub1.user_id=sub2.user_id and sub1.date=sub2.date inner join user on user.username=sub1.user_id WHERE user.username = 'admin' AND sub1.date between '2010-11-01' AND '2010-11-30'
- yambejp
- ベストアンサー率51% (3827/7415)
11/15の売り上げはなぜ20000円なのでしょう?
- t-ka
- ベストアンサー率28% (14/50)
DATETIME型をCASTかCONVERT・・でDATE型もしくは文字列型などに適宜変換する。 (2010-11-13 21:56:54)を(2010-11-13)の様に 例えば CAST(created_at,DATE) AS aaa_time など SELECT , , GROUP BY CAST( , ) AS ex1 FROM access_log SELECT , , CAST( , ) AS ex2 FROM sales 結合する。 JOIN ・・・ ON access_log.ex1 = sales.ex2
お礼
省略されててよく分からないんですけど、1つのSQL文じゃ難しいんでしょうか? どうやって記述するんでしょうか? また、言い忘れましたがアクセスや売上げの無い日付も存在します。 対応できますでしょうか?
お礼
間違えでした、10000円ですね^^;