2017-04-15 37 views
0

我需要一些幫助,以便在MS Access中使用SQL查詢執行以下操作。SQL MS ACCESS:表和篩選結果之間的選擇性操作

我想執行在下面的例子中所示的操作:

初始表

表A

Name H1 H2 H3 
A 5 10 5 
B 1 2 3 
C 7 3 1 

表B:

Name H1 H2 H3 
1  1 1 1 
2  2 2 2 

1 )第一步:結果

NAME TABLE A NAME TABLE B H1 H2 H3 
    A      1  4 9 4 
    A      2  3 8 3 
    B      1  0 1 2 
    B      2  1 0 1 
    C      1  6 2 0 
    C      2  5 1 1 

所以,這個新表的第一行被計算爲ABSOLUTEVALUE(表A(行A) - 表B(ROW1)),該表的第二行。將ABSOLUTEVALUE(表A(行A) - 表B(第2行))等等。

2)第2步驟:結果

NAME TABLE A NAME TABLE B H1 H2 H3 Total 
    A     1   4 9 4 17 
    A     2   3 8 3 14 
    B     1   0 1 2 3 
    B     2   1 0 1 2 
    C     1   6 2 0 8 
    C     2   5 1 1 7 

因此,在這個步驟中,我將需要添加一個字段WHIS被計算爲值H1,H2和每行

3的H3的總和)最終步驟:結果

Name H1 H2 H3 
A  3 8 3 
B  1 0 1 
C  5 1 1 

而且在最後的步驟中,我們選擇從上表中,其中場總計具有最小值的那些A,B &ç行。

謝謝!

+0

數據庫是不一個電子表格,並不像一個工作。表格需要通過常用值而不是行位置相關。此外,「名稱」是保留字,不應用作字段名稱。您應該對數據庫設計和規範化進行一些研究,並重新設計您的表格。 – AVG

+0

AVG,雖然它們通常使用不佳,但CROSS JOIN有時仍然是一種適合某種情況的工具。由於這種情況使用這兩個表的笛卡爾乘積而不需要排除'WHERE','CROSS JOIN'對於這種情況是理想的。它們通常寫成'FROM A,B',儘管有些語言允許'A CROSS JOIN B'。我同意你使用'Name'。儘管我也相信正常化的優勢等等,但我不相信這種情況下的表格可以進一步正常化(有時會發生這種情況)。 – toonice

回答

0

對於第1步,請嘗試...

SELECT A.NameA AS [NAME TABLE A], 
     B.NameB AS [NAME TABLE B], 
     ABS(A.H1 - B.H1) AS H1, 
     ABS(A.H2 - B.H2) AS H2, 
     ABS(A.H3 - B.H3) AS H3 
FROM A, 
    B; 

步驟2,請嘗試...

SELECT A.NameA AS [NAME TABLE A], 
     B.NameB AS [NAME TABLE B], 
     ABS(A.H1 - B.H1) AS H1, 
     ABS(A.H2 - B.H2) AS H2, 
     ABS(A.H3 - B.H3) AS H3, 
     H1 + H2 + H3 AS [Total] 
FROM A, 
    B; 

對於第3步,請嘗試要麼...

SELECT A.NameA AS [NAME TABLE A], 
     MIN(ABS(A.H1 - B.H1)) AS H1, 
     MIN(ABS(A.H2 - B.H2)) AS H2, 
     MIN(ABS(A.H3 - B.H3)) AS H3 
FROM A, 
    B 
GROUP BY A.NameA; 

根據我對AVG的評論,這種情況使用了兩個表的笛卡爾乘積,這是第一個表中的每個記錄都連接到每個第二張表中的記錄。這可以通過執行CROSS JOIN來實現,就像我在每個聲明中放置FROM A, B一樣。此連接爲我們提供了以下數據集...

NameA | A.H1 | A.H2 | A.H3 | NameB | B.H1 | B.H2 | B.H3 
------|------|------|------|-------|------|------|----- 
A  | 5 | 10 | 5 | 1  | 1 | 1 | 1 
A  | 5 | 10 | 5 | 2  | 2 | 2 | 2 
A  | 5 | 10 | 5 | 1  | 1 | 1 | 1 
A  | 5 | 10 | 5 | 2  | 2 | 2 | 2 
A  | 5 | 10 | 5 | 1  | 1 | 1 | 1 
A  | 5 | 10 | 5 | 2  | 2 | 2 | 2 

(請注意,當一個字段被加入到另一個表和它的名字沒有在其他表中,那麼你將能夠繼續提到它只需通過它的名字而不需要指定表名(儘管如果你願意的話,你仍然可以這樣做)。如果新字段確實與另一個表中的字段共享一個名字,那麼每個字段將需要被引用由均爲表名和字段名稱。)

此數據集可用於所有三個任務。

對於第一個任務ABS()功能可以對H1值。請注意,之間的區別使用,如果你生成一個領域,比如與ABS(A.H1 - B.H1),不要給它使用AS,那麼一個名字新字段將被任意賦予一個名稱,這通常是生成該字段的表達式(在這種情況下爲ABS(A.H1 - B.H1))或其他不便之處。因此,如果您打算在等式的其他部分(或其他地方)引用它們,則強烈建議您命名所有生成的字段。

對於第二個任務,只需將計算出的H字段(如H1 + H2 + H3)加起來的表達式就足夠了。

對於第三個任務,我們可以使用在第一個任務中生成的數據集,不包括NameB列。然後,我們可以將這些行按NameA的值分組在一起,並使用聚合函數MIN()從每個H列中選擇最小值。

如果您有任何問題或意見,請隨時發佈相應評論。

進一步閱讀

How to include this SQL subquery for absolute number's value?(上ABS()

How to use cross join in access?(使用在Access中CROSS JOIN

http://www.w3resource.com/sql/joins/cross-join.php(在SQL十字架一般的連接)

+0

非常感謝您的快速和詳細的答案! – MrQP

+0

不客氣。 – toonice