簡體   English   中英

如何使用 MS Access 2003 SQL 計算一個表的兩行中的值之間的差異? 有額外標准

[英]How to calculate the difference between values in two rows of one table using MS Access 2003 SQL? with EXTRA CRITERIA

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 的用戶。 並且有我在工作中需要的數據管理任務。 所以這真的讓我卡住了 go 這是在 ms 訪問中完成的 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 年收到了禮物,但 celia 在 2012 年同時收到了家庭禮物和學校禮物,在這種情況下,我們選擇她的家庭現值進行計算),輸出應該類似於以下內容:

Name              ExactDate        Presents
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
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]

此查詢中的T1T2只是FROM子句中表的別名,以便您可以區分它們。

如果您嘗試將結果放入另一個表中,那么您需要將其作為INSERT語句的一部分。 或者,使用 Access,您可能能夠使用查詢來生成表作為某些向導的一部分。 恐怕我沒有手邊的副本來提供更多細節。 無論如何,下面是INSERT語句的樣子:

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

(省略號只是意味着使用上面的查詢)

您將需要進行self-join ,因為您正在比較同一個表中的行。 下面我們使用模擬日期將 table1 連接到自身,但名稱不同。
更現實的答案是使用唯一的 row_ids 而不是名稱。 接下來,我們告訴數據庫我們只需要 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是保留字,您需要將其括在方括號[]

回答這個問題的關鍵是自加入:

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;
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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM