Делаете вычисления между двумя строками с ДОПОЛНИТЕЛЬНЫМИ КРИТЕРИЯМИ? - PullRequest
1 голос
/ 21 июля 2011
Name      ExactDate  Presents      Location
bob1         2011        1          home
bob2         2008        2          school     
bob2         2012        3          school
mary2        1986        4          school       
mary1        2001        5          home
mary1        2012        6          home    
kate1        2011        7          home
kate1        2012        8          home
kate2        2011        9          school 
celia2       2011       10          school 
celia2       1986       11          school  
celia1       1972       12          home
celia1       2012       14          home 
celia2       2012       13          school

Эта проблема выполняется в SQL в MS Access 2003 для запроса.

Таким образом, цель в том, чтобы вычесть количество подарков, которые Кейт получила от Селии в один и тот же год (но поскольку существует несколько разных нынешних значений для одного и того же года, мы выбираем приоритет дома> школы .... например Селия и Кейт оба получают подарки в 2012 году, но Селия получает и домашние подарки, и школьные подарки в 2012 году, и в этом случае мы выбираем ее текущую стоимость дома, чтобы сделать расчет), и результат должен быть примерно таким:

Name              ExactDate        PresentsDiff
celiaminuskate     2011                      3
celiaminuskate     2012                      6

Пока у меня есть:

SELECT 'celiaminuskate'AS [NAME],T1.[date] AS [EXACT DATE],
T1.presents T2.presents AS [PRESENTS DIFF]
FROM Some_Table T1, Some_Table T2 

часть, которую, я думаю, нужно исправить ??

WHERE (T1.Name = 'celia1'>'celia2')
AND (T2.Name = 'kate1'>'kate2')
AND T2.ExactDate = T1.ExactDate 

чтобы указать приоритет? Я не слишком уверен, как это сделать

ORDER BY T1.ExactDate

1 Ответ

1 голос
/ 21 июля 2011

Я создал этот запрос и сохранил его как qryCeliaAndKateGiftDates.Он просто возвращает различные значения ExactDate, для которых у celia и kate были записаны дары.

Обратите внимание, что я переименовал ваше поле Имя в Получатель , потому что Имя является зарезервированным словом.

SELECT DISTINCT celia.ExactDate
FROM
    [SELECT ExactDate
    FROM Some_Table
    WHERE Recipient Like "celia*"
    ]. AS celia
    INNER JOIN [
        SELECT ExactDate
        FROM Some_Table
        WHERE Recipient Like "kate*"
        ]. AS kate
    ON celia.ExactDate = kate.ExactDate
ORDER BY celia.ExactDate;

Затем я использовал коррелированные подзапросы, чтобы вернуть правильные значения Presents для celia и kate для каждой из этих ExactDates.

SELECT
    raw.recipients AS [NAME],
    raw.ExactDate  AS [EXACT DATE],
    (raw.celia_presents - raw.kate_presents) AS [PRESENTS DIFF]
FROM
    [SELECT
    'celiaminuskate' AS recipients,
    dates.ExactDate,
    (SELECT TOP 1 Presents
    FROM Some_Table
    WHERE
        Recipient Like "celia*"
        And ExactDate = dates.ExactDate
    ORDER BY Location) AS celia_presents,
    (SELECT TOP 1 Presents
    FROM Some_Table
    WHERE
        Recipient Like "kate*"
        And ExactDate = dates.ExactDate
    ORDER BY Location) AS kate_presents
    FROM qryCeliaAndKateGiftDates AS dates]. AS raw;

Возвращает запрошенные результаты при запуске из Access 2003. Однако коррелированные подзапросы печально известны своей медлительностью, поэтому мне будет интересно посмотреть, какие еще ответы вы получите.

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