2012-02-08 14 views
0

次の構造を持つデータベースがあります。各書籍は複数の著者を持つことができ、各著者は複数の書籍を書くことができます。MS Accessで多対多関係を使用して計算する方法

[book:book_id, book_name, book_price] 
[author: author_id, author_name] 
[link:book_id, author_id] 

{book_idとauthor_idがリンクされています。完全な構造はここに示されています:http://i.stack.imgur.com/vIFNU.png}

今や各書籍は価格(通貨)を持っています。価格の30%は、本に寄稿した各著者に均等に分配されるべきです。 私の質問は、特定の年の各著者の合計支払いを見つける方法です。

[私は自分自身の解決策を考えました。

  1. :私は私の解決策の

    アルゴリズムである]あなたが私に、私はそのような操作を行う方法を見つけることができますいくつかのヒントや材料を提供することができれば、それは非常に参考になるステップ1にのみまでを行うことができます

    したがって、各book_idについて、同じbook_idを持つ中間テーブル内のauthor_idの数を見つける必要があります。私はnumber_of_author_in_bookでbook_priceを分割し、30/100でそれを掛けた場合、私はその本のために各著者のアカウントに移動しますその本(payment_of_one_author_in_bookを言う)

    のためのお金を得る

  2. を(クエリによってそれを行うことができます)

  3. 中間テーブルの各author_idについて、対応するbook_idを検索し、その年がクエリの年と一致する場合は、author_idのpayment_of_one_author_in_bookを著者IDに対応する新しい変数(author_payment_this_year)に追加します。事前に

おかげ

答えて

0
SELECT author.AuthorId, author.Author_name, book.Book_Name, book.Book_Price, [Book_Price]/DCount("[Author_id]","[Link]","[Book_id]=" & [Book_Id]) AS Share 
FROM (author INNER JOIN link AS link_1 ON author.AuthorId = link_1.Author_id) INNER JOIN book ON link_1.Book_id = book.Book_Id; 

基本的には、それだけで3つのテーブルの結合です。難しいのは、DCount関数を使用してリンクの著者数を追加することです。このブックを共有します。

1

この例では、エイリアスとサブクエリが含まれています。

SELECT 
    a.author_id, 
    a.author_name, 
    SUM(share.auth_share) AS author_total 
FROM (link l 
INNER JOIN (
    SELECT 
     b.book_id, 
     ([b.book_price] * 0.3)/[no_auth] AS auth_share 
    FROM book b 
    INNER JOIN (
     SELECT 
      l.book_id, 
      COUNT(l.author_id) AS no_auth 
     FROM link l 
     GROUP BY l.book_id) AS ac 
    ON b.book_id = ac.book_id) AS share 
ON l.book_id = share.book_id) 
INNER JOIN author a 
ON l.author_id = a.author_id 
GROUP BY a.author_id,a.author_name 
関連する問題