本文說明如何在 Access 中使用頂值查詢,找出一組紀錄中最近或最早的日期。 你可以利用這類查詢所回傳的資訊來回答各種商業問題,例如顧客上次下訂單的時間。
您想要做什麼?
了解頂值查詢如何與日期互動
當你需要尋找包含表格或紀錄組中最新或最早日期的紀錄時,你會使用頂值查詢。 接著你可以利用這些數據回答多種類型的商業問題,例如:
- 員工上一次銷售是什麼時候? 這個答案可以幫助你辨識出生產力最高或效率最低的員工。
- 顧客上次下訂單是什麼時候? 如果客戶在一定期間內未下訂單,您可能想將該客戶移至非活躍名單。
- 誰有下一個生日,或下一個n個生日?
建立及使用頂值查詢的規則
你要先建立一個選擇查詢來建立頂值查詢。 根據你想要的結果,你可以對查詢套用排序順序,或是將查詢轉換成總查詢。 如果你轉換查詢,接著會使用彙總函數,例如 最大 值或 最小 值來回傳最高或最低值,或用 第一 或 最後來 回傳最早或最晚的日期。 只有當你需要找到屬於一組或類別的資料時,才會使用總數查詢和彙總函數。 舉例來說,假設你需要查找公司所在城市某一天的銷售數字。 在這種情況下,城市會變成分類, (你需要找到每個城市) 的資料,所以你會用總數查詢。
在進行過程中,請記得無論查詢類型為何,查詢都必須使用包含描述性資料的欄位,例如客戶名稱,以及包含你想找到的日期值的欄位。 此外,日期值必須位於設定為日期/時間資料型別的欄位中。 本文描述的查詢如果用短文字欄位的日期值執行,會失敗。 此外,如果你想使用總數查詢,你的資料欄位必須包含類別資訊,例如城市或國家/地區欄位。
在頂值查詢與篩選器之間做選擇
要判斷是否應該建立頂值查詢或套用篩選器,請選擇以下之一:
- 如果你想回傳欄位中最近或最新日期的紀錄,但你不知道確切的日期值,或它們不重要,你就要建立一個頂值查詢。
- 如果你想回傳所有日期相符、早於或晚於特定日期的紀錄,你就會使用篩選器。 例如,要查看四月至七月之間的銷售日期,你需要套用篩選器。 關於過濾器的完整討論超出這個主題範圍。
欲了解更多關於建立及使用篩選器的資訊,請參閱文章 《套用篩選器以檢視 Access 資料庫中的部分紀錄》。
查找最近或最早的日期
本節步驟說明如何建立使用排序順序的基本頂值查詢,以及使用表達式及其他條件的進階查詢。 第一部分示範建立頂值查詢的基本步驟,第二部分則說明如何透過加入條件來找到接下來幾位員工的生日。 這些步驟使用以下範例表格中的資料。
| 姓氏 | 名字 | 地址 | 城市 | 國家/地區 | 出生日期 | 聘用日期 |
|---|---|---|---|---|---|---|
| 劉 | 沙東 | 1 Main St. | New York | Taiwan | 1968年2月5日 | 1994年6月10日 |
| 救護 | 瓦利德 | 52 1st St. | Boston | Taiwan | 1957年5月22日 | 1996年11月22日 |
| 盧珮佳 | 圭多 | 3122 75th Ave. S.W. | Seattle | Taiwan | 1960年11月11日 | 2000年3月11日 |
| 貝果 | 尚·菲利普 | 1 Contoso Blvd. | London | UK | 1964年3月22日 | 1998年6月22日 |
| 價格 | 朱利安 | Calle Smith 2 | Mexico City | 墨西哥 | 1972年6月5日 | 2002年1月5日 |
| 休斯 | 克莉絲汀 | 南75街3122號 | 台北市 | Taiwan | 1970年1月23日 | 1999年4月23日 |
| 萊利 | 史蒂夫 | 67 Big St. | Tampa | Taiwan | 1964年4月14日 | 2004年10月14日 |
| 伯克比 | 達娜 | 2號諾西公園道 | 苗栗縣 | Taiwan | 1959年10月29日 | 1997年3月29日 |
如果你願意,可以手動將這些範例資料輸入新表格,或者將範例資料複製到試算表程式,如 Microsoft Excel,然後使用 Access 將產生的工作表匯入表格。
建立一個基本的頂值查詢
在 [建立] 索引標籤的 [查詢] 群組中,按一下 [查詢設計]。
在對話框中,點選你想用於查詢的表格 ,點選 新增將表格放入設計器上方,然後點擊 關閉。
-或-
雙擊表格,然後點擊 關閉。
如果你使用前一節列出的範例資料,請將員工資料表加入查詢中。將你想在查詢中使用的欄位加入設計網格。 你可以雙擊每個欄位,或將欄位拖放到欄位列的空白格子上。
如果你使用範例表,請新增名字、姓氏和出生日期欄位。在包含你最上面或最下面值 (出生日期欄位裡,如果你使用範例表) ,請點選 排序 列,選擇 升序 或 降序。
降序回傳最近日期,遞減排序回傳最早日期。重要
你必須在 排序 列中只設定包含日期欄位的值。 如果你為其他欄位指定排序順序,查詢不會回傳你想要的結果。
在 查詢設計 分頁的 查詢設定 群組中,點擊「 全部 」 (「 Top Values 」清單) 旁的向下箭頭,然後輸入你想看到的紀錄數量,或從列表中選擇選項。
點擊 執行
以執行查詢並在資料表檢視中顯示結果。儲存查詢並保持開啟,方便後續使用。
你可以看到這類頂尖價值問題可以回答基本問題,例如誰是公司中年紀最大或最年輕的人。 接下來的步驟將說明如何運用表達式及其他標準,為查詢增添力量與彈性。 下一步顯示的標準會回傳接下來三個員工的生日。
在查詢中加入條件
注意
這些步驟假設你會使用前一節描述的查詢。
- 將你在前幾個步驟建立的查詢切換到設計檢視。
- 在查詢設計網格中,出生日期欄右側的欄中,複製貼上或輸入此表達式: Expr1: DatePart (“m”,[Birth Date]) 。 然後點擊 「執行」。
DatePart 函式會擷取出生日期欄位中的月份部分。 - 切換到設計檢視。
- 在你第一個表達式的右側,貼上或輸入此表達式: Expr2: DatePart (“d”,[Birth Date]) 。 然後點擊 「執行」。
此時, DatePart 函數會擷取出生日期欄位中的日期部分。 - 切換到設計檢視。
- 在 你 剛輸入的兩個表達式中,清除顯示列中的勾選框,點選每個表達式的 排序 列,然後選擇 「升遷」。
- 按一下 [執行]。
- 你可以選擇性地指定條件來限制查詢範圍。 當你指定條件時,查詢只會排序符合條件的紀錄,並從排序清單中識別最上或最底的欄位值。
若要繼續取樣資料,請切換到設計檢視。 接著,在出生日期欄的標準列輸入以下表達式:
月 ([出生日期]) > 月 (日期 () ) 或月 ([出生日期]) = 月 (日期 () ) 與日期 ( ) > (日期 () )
此表達式的運作方式如下: 月份 ([出生日期]) 月 (日期 () ) > 部分會檢查每位員工的出生日期是否落在未來的月份,若屬實,則將相關紀錄納入查詢中。 月份 ([出生日期]) = 月 (日期 () ) 與日期 ([出生日期]) >日期 (日期 表達式中 () ) 部分檢查當月的出生日期,以判斷生日是否落在當天或之後。 如果該條件為真,函式會將這些紀錄納入查詢中。 總結來說:此表達式忽略了生日落在1月1日與您查詢日期之間的任何紀錄。
欲查看更多查詢準則表達式的範例,請參閱文章 《查詢準則範例》。 - 在 查詢設計 分頁的 查詢設定 群組中,點擊「 全部 」 (「 Top Values 」清單) 旁的向下箭頭,然後輸入你想看到的紀錄數量,或從列表中選擇選項。
要查看接下來的三個生日,請輸入 3。 - 點擊 執行
以執行查詢並在資料表檢視中顯示結果。
如果你看到的紀錄比你指定的還多
如果你的資料包含多個相同日期值的紀錄,頂值查詢可能會回傳比你指定的更多資料。 例如,你可以設計一個頂值查詢來取得三筆員工紀錄,但因為「Wilson」和「Edwards」同日生日,查詢結果會回傳四筆紀錄,如下表所示。
| 姓氏 | BirthDate |
|---|---|
| 貝爾卡 | 9/26/1968 |
| 傑克森 | 10/2/1970 |
| 愛德華茲 | 10/15/1965 |
| 威爾森 | 10/15/1969 |
如果你看到的紀錄比你指定的少
假設你設計了一個查詢,要回傳欄位中最上面或最底五條記錄,但查詢只回傳三條記錄。 一般來說,這類問題的解決方式是打開設計檢視的查詢,並檢視設計格子中欄位的 Criteria 列。
欲了解更多標準資訊,請參閱文章 《查詢標準範例》。
如果你看到重複的紀錄
如果頂值查詢回傳重複,底層資料表要麼包含重複記錄,要麼因為查詢未包含可區分記錄的欄位,而看起來是重複記錄。 例如,下表顯示查詢結果,回傳最近出貨的五個訂單,以及處理該交易的銷售人員姓名。
| ShippedDate | 銷售人員 |
|---|---|
| 11/12/2004 | 自由黨 |
| 11/12/2004 | 卡亨 |
| 10/12/2004 | 德爾加多 |
| 10/12/2004 | 德爾加多 |
| 10/12/2004 | 自由黨 |
第三和第四張紀錄看似重複,但銷售員Delgado可能處理了兩筆同一天出貨的不同訂單。
根據你的需求,你可以採取兩種方法來避免退回重複的紀錄。 你可以更改查詢設計,加入有助於區分紀錄的欄位,例如 OrderID 和 CustomerID 欄位。 或者,如果只看到其中一條重複紀錄就足夠,你可以透過將查詢的 Unique Values 屬性設為 「是」來只顯示不同的紀錄。 要設定這個屬性,在查詢設計檢視中,右鍵點擊查詢設計器上半部空白區域的任意位置,然後在快捷鍵選單中點 選屬性 。 在查詢的屬性表中,找到 Unique Values 屬性並設 為「是」。
欲了解更多關於處理重複紀錄的資訊,請參閱「 以查詢尋找重複記錄」一文。
查找分類或群組中記錄的最晚或最早日期
你可以使用總數查詢來尋找屬於群組或類別的紀錄的最早或最新日期。 總數查詢是一種選擇查詢,使用如最小值、最大值、總和、第一和最後等彙總函數來計算給定欄位的數值。
本節步驟假設你經營活動管理公司——負責舞台佈置、燈光、餐飲及大型活動的其他面向。 此外,你管理的活動也分為多個類別,例如產品發表會、街頭市集和演唱會。 本節步驟說明如何回答一個常見問題:下一場活動何時舉行,按類別分類? 換句話說,下一次產品發表會、下一場演唱會是什麼時候,等等。
在進行過程中,請記得以下幾點:預設情況下,你在這裡建立的總計查詢類型只能包含包含你的群組或類別資料的欄位,以及包含日期的欄位。 你不能包含其他描述該類別商品的欄位,例如客戶或供應商名稱。 不過,你可以建立第二個查詢,將總數查詢與包含描述性資料的欄位結合起來。 本節後面的步驟會說明如何完成這項任務。
本節步驟假設使用以下三個表格:
事件類型表
| TypeID | 事件類型 |
|---|---|
| 1 | 產品發表 |
| 2 | 企業職能 |
| 3 | 私人功能 |
| 4 | 募款活動 |
| 5 | 貿易展 |
| 6 | 講座 |
| 7 | 演唱會 |
| 8 | 展覽 |
| 9 | 街頭嘉年華 |
[客戶] 資料表
| 客戶識別碼 | 公司 | 連絡人 |
|---|---|---|
| 1 | Contoso, Ltd. 圖像 | 喬納森·哈斯 |
| 2 | Tailspin Toys | 艾倫·亞當斯 |
| 3 | Fabrikam | 卡蘿·菲利普斯 |
| 4 | Wingtip Toys | 盧西奧·亞洛 |
| 5 | A. 基準面 | 曼達爾·薩曼特 |
| 6 | 冒險工廠 | 布萊恩·伯克 |
| 7 | 設計學院 | 賈卡石碑 |
| 8 | 美術學院 | 米蓮娜·杜馬諾娃 |
賽事表
| 事件識別碼 | 事件類型 | 客戶 | 活動日期 | 價格 |
|---|---|---|---|---|
| 1 | 產品發表 | Contoso, Ltd. | 4/14/2003 | $10,000 |
| 2 | 企業職能 | Tailspin Toys | 4/21/2003 | $8,000 |
| 3 | 貿易展 | Tailspin Toys | 5/1/2003 | 25,000美元 |
| 4 | 展覽 | Graphic Design Institute | 5/13/2003 | $4,500 |
| 5 | 貿易展 | Contoso, Ltd. | 5/14/2003 | 55,000美元 |
| 6 | 演唱會 | 美術學院 | 5/23/2003 | $12,000 |
| 7 | 產品發表 | A. 基準面 | 6/1/2003 | $15,000 |
| 8 | 產品發表 | Wingtip Toys | 6/18/2003 | $21,000 |
| 9 | 募款活動 | 冒險工廠 | 6/22/2003 | $1,300 |
| 10 | 講座 | Graphic Design Institute | 6/25/2003 | $2,450 |
| 11 | 講座 | Contoso, Ltd. | 7/4/2003 | 3800美元 |
| 12 | 街頭嘉年華 | Graphic Design Institute | 7/4/2003 | $5,500 |
注意
本節步驟假設客戶資料表與事件類型資料表位於事件資料表一對多關係的「一」側。 在這種情況下,事件資料表會共用 CustomerID 和 TypeID 欄位。 接下來章節描述的總數查詢若沒有這些關聯,將無法運作。
如何?將這些資料加入資料庫?
若要將這些範例表格加入資料庫,您可以將資料複製到 Excel,然後匯入資料,但有幾個例外:
- 當你將事件類型和客戶資料表複製到 Excel 時,不要複製 TypeID 和 CustomerID 欄位。 當你匯入工作表時,Access 會為你新增一個主要鍵值;這能幫你省下不少時間。
- 匯入表格後,您必須在設計檢視中開啟事件表,並將事件類型與客戶欄位轉換成查找欄位。 為此,點選每個欄位的資料 型別 欄位,然後點選 查詢精靈。
作為建立查詢欄位的一部分,Access 會將事件類型與客戶欄位中的文字值替換為來源資料表的數值。
欲了解更多關於建立及使用查詢欄位的資訊,請參閱「 建立或刪除多值欄位」條目。 那篇文章說明了如何建立一種查詢欄位,讓你能為同一欄位選擇多個值,並且說明如何建立查詢清單。
建立總數查詢
在 [建立] 索引標籤的 [查詢] 群組中,按一下 [查詢設計]。
雙擊你想使用的表格。 每個資料表都會出現在查詢設計器的上方區塊。
如果你使用上述範例表,請加入事件表和事件類型表。雙擊你想在查詢中使用的資料表欄位。 此時請確保只新增群組欄位或類別欄位及值欄位。
如果你使用前三個表格中列出的範例資料,你可以從事件類型資料表中加入事件類型欄位,或是從事件資料表中加入事件日期欄位。你可以選擇性地指定一個條件來限制查詢的範圍。 只有符合條件的紀錄才會被排序,並在排序後的列表中識別上下欄位的值。
例如,如果你想在 Private Function 類別中回傳事件,可以在事件類型欄位的 Criteria 列輸入這個表達式:「<>Private Function」。
欲查看更多查詢準則表達式的範例,請參閱文章 《查詢準則範例》。將查詢轉換為總數查詢,請執行以下操作:
在查詢設計標籤的顯示/隱藏群組中,點選「總計」。
總計列會出現在設計網格中。確保每個群組或類別欄位的 Totals 列設為 Group By,然後將價值欄位的 Totals 列 () 的頂部或底部欄位設為 Max 或 Min。
Max 回傳數字欄位中最大的值,以及日期/時間欄位中最近的日期或時間值。 最小 值回傳數字欄位中的最小值,以及日期/時間欄位中最早的日期或時間值。在 查詢設計 分頁的 查詢設定 群組中,點擊「 全部 」 (「 Top Values 」清單) 旁的向下箭頭,然後輸入你想看到的紀錄數量,或從列表中選擇選項。
此時,選擇 「全部」,然後點 選「執行 」以顯示結果到資料表檢視中。注意
根據你在第 6 步選擇的函式,Access 會將查詢中值欄位的名稱改為 MaxOfFieldName 或 MinOfFieldName。 如果你使用範例表格,Access 會將欄位重新命名為 MaxOfEvent Date 或 MinOfEvent Date。
儲存查詢信後繼續下一步。
查詢結果不會顯示產品名稱或其他相關資訊。 要看到這些額外資料,你需要建立第二個查詢,將剛建立的查詢納入其中。 接下來的步驟會說明如何做到這點。
建立第二個查詢以增加更多資料
- 在 [建立] 索引標籤的 [查詢] 群組中,按一下 [查詢設計]。
- 點選「 查詢 」標籤,然後雙擊你在前一節建立的總數查詢。
- 點選 「表格」 標籤,加入你在總計查詢中使用的資料表,並加入包含其他相關資料的資料表。 如果你使用前述三個範例資料表,請將事件類型、事件和客戶資料表加入你的新查詢中。
- 將 totals 查詢中的欄位與父表格中對應的欄位連結起來。 為此,將總數查詢中的每個欄位拖曳到表格中對應的欄位。
如果你使用三個表格的範例資料,將總數查詢中的事件類型欄位拖曳到事件類型資料表中的事件類型欄位。 接著你將總數查詢中的 MaxOfEvent Date 欄位拖曳到 Events 資料表中的 Event Date 欄位。 建立這些連接後,你的新選取查詢能將總數查詢中的資料與其他資料表中的資料合併在一起。 - 再加上查詢中其他資料表的額外描述欄位。
如果你使用三個資料表的範例資料,可以從客戶資料表加入公司和聯絡人欄位。 - 可選擇為一欄或多欄指定排序順序。 例如,若要依字母順序列出類別,請將事件類型欄位的排序列設為「升序」。
- 在 查詢設計 標籤的 結果 群組中,點選 執行。
查詢結果會顯示在資料表檢視中。
秘訣
如果你不希望 價格 欄位的標題顯示為 MaxOfPrice 或 MinOfPrice,請在設計檢視中開啟查詢,並在網格中的價格欄位輸入 Price: MaxOfPrice 或 Price: MinOfPrice。 價格 會以資料表檢視中欄位標題的形式出現。
查找最新及最早的日期
你在本文前面建立的查詢可以回傳頂部或底部的值,但不能同時回傳兩個值。 如果你想在同一視圖中看到兩組數值,你需要建立兩個查詢——一個檢索最高值,另一個檢索底部值——然後將結果合併並儲存在單一表格中。
尋找最高與最底值並將資料顯示於表格中的過程大致遵循以下步驟:
建立一個頂值和底值查詢,或者如果你需要將資料分組,也可以建立使用 最小 值和 最大 值的總值查詢。
將你的頂值查詢 (或 Max 總數查詢) 轉換成建立表格查詢,並建立一個新的表格。
將底值查詢 (或最小總數查詢) 轉成附加查詢,並將紀錄附加到頂值表。
這些章節中的步驟說明了如何做到這點。
建立查詢- 建立頂值和底值查詢。
關於建立頂值或底值查詢所需的步驟,請參見本文前面的 「查找最近或最早日期」。 若您需要依類別分組記錄,請參閱本文前方 「查找分類或群組紀錄的最新或最早日期」。
如果你使用上一節的取樣表,請只使用事件表中的資料。 在兩個查詢中都使用事件類型、客戶和事件日期欄位。 - 將每個查詢以有意義的名稱保存,例如「頂值」和「底值」,並保持開啟,方便後續步驟使用。
- 建立頂值和底值查詢。
建立 make table 查詢
- 在設計檢視中開啟您的最高價值查詢:
在 查詢設計 標籤的查詢 類型 群組中,點選 「建立表格」。
[製成資料表] 對話方塊便會出現。 - 在 資料表名稱 框中,輸入一個會儲存頂端和底端記錄的資料表名稱。 例如,輸入 「Top Records」和「Bottom Records」,然後點 選確定。
每次執行查詢時,查詢不會以資料表檢視顯示結果,而是建立一個表格,並將頂值替換為當前資料。 - 儲存並關閉查詢。
建立一個附加查詢
- 在設計檢視中,你用底部值查詢:
在 查詢設計 標籤的查詢 類型 群組中,點擊 附加。 - [新增] 對話方塊就會出現。
- 輸入你在 「建立表格 」對話框中輸入的同一個名字。
例如,輸入 「Top Records」和「Bottom Records」,然後點 選確定。 每次執行查詢時,查詢不會在資料表檢視中顯示結果,而是將紀錄附加到頂紀錄和底紀錄表。 - 儲存並關閉查詢。
執行查詢
- 你現在準備好執行這兩個查詢了。 在導覽窗格中,雙擊頂端的值查詢,當「存取」提示時點 選「是 」。 接著雙擊「底部值」查詢,當「存取」提示時點 「是 」。
- 在資料表檢視中開啟頂紀錄表與底紀錄表。
重要
如果你嘗試執行 make-table 或附加查詢,但似乎什麼都沒發生,請檢查存取狀態列中的以下訊息:
[巨集指令或事件已經被停用模式封鎖。]
如果你看到那則訊息,請採取以下步驟:
- 選擇 啟用此內容 ,然後點擊 確定。
- 再次執行查詢。