このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/db/1274791771/607
#  MySQLServer5.1(WinXP)です。 
#   
#  下記のような3種類のテーブルがあります。 
#  これを集計して、指定したユーザーの指定月のアクセス日時と売上げ金額を表にしたいと思っています。 
#   
#  こんな感じに。 
#   
#  +--+--------+----------+-------+-----+ 
#  | id | username| date   | access | sales | 
#  +--+--------+----------+-------+-----+ 
#  | 1 | admin | 2010-11-13 |   2 | 5000 | 
#  | 1 | admin | 2010-11-14 |   2 | 5000 | 
#  | 1 | admin | 2010-11-15 |  1 | 20000 | 
#  +--+--------+----------+-------+-----+ 
#   
#   
#  SELECT u.id AS id, u.username, DATE(a.created_at) AS date, COUNT(*) AS access, SUM(s.amount) AS sales 
#  FROM sf_guard_user u INNER JOIN sales s ON u.username = s.user_id LEFT JOIN access_log a ON u.username = a.user_id 
#  WHERE (u.username = 'admin' AND a.created_at > '2010-11-01 00:00:00' AND a.created_at < '2010-11-30 23:59:59') GROUP BY date ORDER BY a.created_at; 
#  とやってみたのですがダメでした;; 
#   
#   
#  ■ユーザー情報テーブル 
#  mysql> select id,username from user; 
#  +--+---------+ 
#  | id | username | 
#  +--+---------+ 
#  | 1 | admin   | 
#  +--+---------+ 
#   
#  ■アクセスログテーブル 
#  mysql> select * from access_log; 
#  +--+-------+--------+------------------+ 
#  | id | user_id | ip     | created_at      | 
#  +--+-------+--------+------------------+ 
#  | 1 | admin  | 127.0.0.1 | 2010-11-13 21:56:54 | 
#  | 2 | admin  | 127.0.0.1 | 2010-11-13 21:56:54 | 
#  | 3 | admin  | 127.0.0.1 | 2010-11-14 21:56:54 | 
#  | 4 | admin  | 127.0.0.1 | 2010-11-14 21:56:54 | 
#  | 5 | admin  | 127.0.0.1 | 2010-11-15 21:56:54 | 
#  +--+-------+--------+------------------+ 
#   
#  ■売上げ金額テーブル 
#  mysql> select * from sales; 
#  +--+-------+------+------------------+ 
#  | id | user_id | amount| created_at      | 
#  +--+-------+------+------------------+ 
#  | 1 | admin  |  5000 | 2010-11-13 21:56:54 | 
#  | 2 | admin  |  5000 | 2010-11-14 21:56:54 | 
#  | 3 | admin  |  5000 | 2010-11-15 21:56:54 | 
#  | 4 | admin  |  5000 | 2010-11-15 21:56:54 | 
#  +--+-------+------+------------------+  
# 
# 

'下記のような3種類のテーブルがあります。これを集計して、指定したユーザーの指定月のアクセス日時と売上げ金額を表にしたいと思っています。'(_username) :-
        user(_id,_username),
        アクセスログテーブル_date(_username,_アクセスログ_dateならび),
        売上げ金額テーブル_date(_username,_売上金額テーブル_dateならび),
        共通部分(_アクセスログ_dateならび,_売上金額テーブル_dateならび,_date_共通部分),

        write('+--+-------+--------+------------------+ \n'),
        write('| id | user_id | amount| created_at      | \n'),
        write('+--+-------+------+------------------+ \n),

        append(L0,[_date|R],_date_共通部分),
        length(L0,Len0),
        _id is Len0 + 1,
        count((
                    access_log(_,_user_id,_ip,_create_at),
                    sub_atom(_create_at,0,10,_,_create_at)),
                _access),
        findsum(_amount,(
                    sales(_,_user_id,_amount,_create_at),
                    sub_atom(_create_at,0,10,_,_create_at)),
                _sales),
        write_formatted('| %t | %t | %t | %t | %t |\n',[_id,_username,_date,_access,_sales]),
        R = [],
        write('+--+-------+------+------------------+\n').

アクセスログテーブル_date(_user_id,_dateならび) :-
        findsetof(_date,(
                     access_log(_,_user_id,_,_created_at),
                     sub_atom(_create_at,0,10,_,_date)),
                  _dateならび).

売上げ金額テーブル_date(_user_id,_dateならび) :-
        findsetof(_date,(
                     sales(_,_user_id,_amount,_created_at),
                     sub_atom(_create_at,0,10,_,_date)),
                  _dateならび).