Как рассчитать разницу между значениями в двух строках одной таблицы с помощью MS Access 2003 SQL?с ДОПОЛНИТЕЛЬНЫМИ КРИТЕРИЯМИ - PullRequest
0 голосов
/ 19 июля 2011
Name     ExactDate  Presents
bob      2011        1
bob      2008        2
bob      2012        3
mary     1986        4
mary     2001        5
mary     2012        6
kate     2011        7
kate     2012        8
kate     2013        9
celia    2011       10
celia    1986       11
celia    1972       12
celia    2012       13
celia    1991       14

Таким образом, цель состоит в том, чтобы вычесть количество подарков, которые Кейт получила от Селии в тот же день, и на выходе должно быть что-то вроде следующего:

Name              ExactDate        Presents
celiaminuskate    2011              3
celiaminuskate    2012              5

Большое вам спасибо, я впервые пользуюсь доступом и SQL. и иметь задачу управления данными требуется от меня на работе. так что это действительно застряло Это сделано в MS Access 2003 SQL



ЭЙ, ТАК, ЧТО Я ПОЛУЧИЛ ПЕРВАЯ ЧАСТЬ, И СЕЙЧАС ЕГО ТРЕБУЕТСЯ, СЧИТАЯ, что НАБОР ДАННЫХ СЕЙЧАС КАК ЭТОТ

Name     ExactDate  Presents  Location
bob      2011        1          home
bob      2008        2          school     
bob      2012        3          school
mary     1986        4          school       
mary     2001        5          home
mary     2012        6          homw    
kate     2011        7          home
kate     2012        8          home
kate     2011        9          school 
celia    2011       10          school 
celia    1986       11          school  
celia    1972       12          home
celia    2012       14          home 
celia    2012       13          school

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

Name              ExactDate        Presents
celiaminuskate    2011              3
celiaminuskate    2012              6

Ответы [ 4 ]

3 голосов
/ 19 июля 2011

Это должно сделать это:

SELECT
    'celiaminuskate' AS [NAME],
    T1.[date] AS [EXACT DATE],
    T1.presents - T2.presents AS [PRESENTS DIFF]
FROM
    Some_Table T1
INNER JOIN Some_Table T2 ON
    T2.[name] = 'kate' AND
    T2.[date] = T1.[date]
WHERE
    T1.[name] = 'celia'
ORDER BY
    T1.[date]

Несколько советов, поскольку вы новичок в SQL:

  1. Старайтесь избегать использования ключевых слов, таких как "дата" для столбцаимена
  2. Ваш столбец "дата" выглядит как год, а не как дата.Он должен быть назван соответствующим образом, и вы должны убедиться, что это правильный тип данных.

Поскольку это звучит так, как будто используемая вами версия Access не поддерживает теперь стандартный синтаксис JOINВот еще один запрос, который должен быть эквивалентен:

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] = 'celia' AND
    T2.[name] = 'kate' AND
    T2.[date] = T1.[date]
ORDER BY
    T1.[date]

T1 и T2 в этом запросе являются просто псевдонимами для таблиц в предложении FROM, чтобы их можно было различить.

Если вы пытаетесь поместить результаты в другую таблицу, тогда вам нужно, чтобы это было частью оператора INSERT.Или, с помощью Access, вы можете использовать запрос для создания таблицы как часть какого-либо мастера.Боюсь, что у меня нет под рукой копии, чтобы дать больше подробностей.В любом случае, вот как будет выглядеть выражение INSERT:

INSERT INTO Some_New_Table (name, exactdate, presentsdiff)
SELECT ...

(Многоточие просто означает использование запроса, как указано выше)

2 голосов
/ 19 июля 2011

Ключ к ответу - самостоятельное присоединение:

SELECT 'Celia - Kate' AS tag, C.ExactDate, C.Presents - K.Presents
  FROM (SELECT ExactDate, Presents FROM AnonymousTable WHERE Name = 'celia') AS C
  JOIN (SELECT ExactDate, Presents FROM AnonymousTable WHERE Name = 'kate')  AS K
    ON C.ExactDate = K.ExactDate
 ORDER BY C.Date;
2 голосов
/ 19 июля 2011

Вам нужно будет сделать self-join, потому что вы сравниваете строки из одной таблицы. Ниже мы присоединяем table1 к себе, используя симметричные даты, но под разными именами.
Более реалистичный ответ будет использовать уникальные row_ids вместо имен. Далее мы сообщаем базе данных, что нам нужны только строки celia в part1 и только строки kate в part2.

SELECT 'celiaminuskate' AS useless_filler
       , a.[date] AS whendidthishappen
       , (celia.presents - kate.presents) AS outcome
FROM table1 AS kate
INNER JOIN table1 AS celia ON (a.[date] = b.[date] and a.name <> b.name)
WHERE celia.name = 'celia' and kate.name = 'kate'

Обратите внимание, что date является зарезервированным словом, и вам нужно заключить его в квадратные скобки []

1 голос
/ 19 июля 2011
SELECT 'celiaminuskate', p1.exactdate, p1.presents - p2.presents
FROM presents p1 JOIN presents p2 ON p1.exactdate = p2.exactdate
WHERE p1.name = 'celia' AND p2.name = 'kate'
...