如何使用MS Access 2003 SQL计算一个表的两行中的值之间的差异?与EXTRA CRITERIA

时间:2011-07-19 16:02:24

标签: sql ms-access ms-access-2003

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 个答案:

答案 0 :(得分:3)

这应该这样做:

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. 您的“日期”列似乎是一年,而不是日期。它应该被恰当地命名,你应该确保它是正确的数据类型。
  3. 由于听起来您正在使用的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]
    
    此查询中的

    T1T2只是FROM子句中表的别名,因此您可以区分它们。

    如果您尝试将结果放入另一个表中,那么您需要将其作为INSERT语句的一部分。或者,使用Access,您可以使用查询生成表作为某个向导的一部分。我担心我没有副本可以提供更多细节。无论如何,这是INSERT语句的样子:

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

    (省略号只是意味着使用我在上面提到的查询)

答案 1 :(得分:2)

您需要执行self-join,因为您要比较同一个表中的行。 下面我们使用类似日期将table1连接到自身,但名称不同 更现实的答案是使用唯一的row_id而不是名称。 接下来,我们告诉数据库我们只需要part1中的celia行和part2中只有kate的行。

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是保留字,您需要将其括在方括号[]

答案 2 :(得分:2)

回答这个问题的关键是自我加入:

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;

答案 3 :(得分:1)

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'