Как сделать расчет, используя отношение «многие ко многим» в MS Access - PullRequest
0 голосов
/ 08 февраля 2012

У меня есть база данных, имеющая следующую структуру.У каждой книги может быть несколько авторов, и каждый автор может написать несколько книг.

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

{book_id's и author_id's связаны между собой.полная структура показана здесь: http://i.stack.imgur.com/vIFNU.png}

Теперь у каждой книги есть цена (валюта).30% цены должны быть в равной степени распределены между каждым автором, внесшим свой вклад в книгу. Мой вопрос заключается в том, как найти общий платеж для каждого автора за определенный год.

[Я сам думал о решении.Я мог сделать только до шага 1. Если вы можете предоставить мне некоторые подсказки или материалы, где я могу найти, как сделать такие манипуляции, это было бы очень полезно]

Алгоритм моего решения:

  1. Итак, для каждого book_id мне нужно найти число author_id в средней таблице, у которого тот же book_id.(может сделать это по запросу)

  2. Если я разделю book_price на number_of_author_in_book и умножу его на 30/100, я получу деньги за эту книгу, которые пойдут на счет каждого автора дляэта книга (скажем, payment_of_one_author_in_book)

  3. Для каждого author_id в средней таблице я ищу соответствующий book_id и добавляю payment_of_one_author_in_book для этого author_id в новую переменную (author_payment_this_year), соответствующуюID автора, если год соответствует году запроса.

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

Этот пример включает псевдонимы и подзапросы.

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
0 голосов
/ 08 февраля 2012
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;

По сути, это всего лишь объединение трех таблиц. Единственный хитрый момент - использование функции DCount для определения количества авторов в Link, которые используют этот book_ID

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...