2012-02-09 37 views
8

Possible Duplicate:
Combine rows in Access 2007
Access 2007 - Concatenate fields from one column in one table into a single, comma delmited value in another table串聯多行成一條線在MS Access

目前,我有一個表結構,有些類似於這樣:

名稱 --- --- 說明 - - Thresh的 --- 打擊樂 --- 錯誤 --- BP
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 ----- ADC2
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 2 ----- BAC2
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 ----- RBE2
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 8 ----- VBE2
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 6 ----- AEC2
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 ----- PBC2
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 1 ----- XBC4
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- AEC2
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- PBC2
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 3 ----- ADC2
Bob - ----- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- ADC2
Bob ---- --- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- BAC2
Joe ------ --C1 ------- Inf --------- 7Per -------- 0.05 ------ 0 ----- PBC2
Joe ---- ---- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0 ----- ZTM2
Joe-- ------ C1 ------- Inf --------- 7Per -------- 0.05 ------ 2 ----- QYC2
Joe -------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0 ----- FLC2
Joe -------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 1 ----- KSC2
Joe -------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0 --- --JYC2

我想要做的是每個「名稱」和每個「貓」,這將總結所有的「Err」(每個「名稱」和「貓」)並連接只有1行將「BP」字段合併爲一行。如:

名稱 --- --- 說明 --- Thresh的 --- 打擊樂 --- 錯誤 --- BP
鮑勃 - ------ C1 ------- Inf -------- 7Per -------- 0.05 ----- 16 ----- BAC2,VBE2,AEC2
Bob ------- C2 ------ Com ------ 8Per -------- 0.45 ------ 4 ------ XBC4,ADC2
Joe -------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 3 ------ QYC2, KSC2

有類似的問題,但我似乎無法應用它,因爲我的VBA腳本知識是初學者。有沒有辦法通過SQL來完成所有這些?如果VBA腳本是唯一的選擇(即創建一個函數),任何幫助將不勝感激。先謝謝你。

問題第2部分:
我按照Allen Browne的指南創建了該函數。該模塊保存爲modConcatRelated。現在,我試圖運行此查詢(林不知道這是否是正確的SQL得到,我正在尋找的結果):

SELECT 
    [Name], 
    [Cat], 
    [Desc], 
    [Thresh], 
    [Perc], 
    sum([Err]), 
    ConcatRelated("[BP]", "make_table_bp", "[Err] = " & [BP]) 
FROM make_table_bp 
GROUP BY 
    [Name], 
    [Cat], 
    [Desc], 
    [Thresh], 
    [Perc], 
    [Err], 
    [BP]; 

它說:「錯誤3061參數太少預期1.」它還說「未定義函數ConcatRelated」。我正在尋找關於如何創建正確的SQL語句的指導,以便我可以正確地調用ConcatRelated函數併產生如上所述的結果。再次感謝。

下一個問題:
如果什麼表有一個唯一的日期字段標籤作爲表中的最後一列。事情是這樣的:

名稱 --- --- 說明 --- Thresh的 --- 打擊樂 --- 錯誤 --- BP --- 日期

Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0- ---- ADC2--12/02/2011
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05- ---- -2 ----- BAC2--09/05/2011
Bob ------- C1 ------- Inf -------- 7Per ------- -0.05 ------ 0 ----- RBE2--11/02/2011
Bob ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 8 ----- VBE2--08/14/2012
Bob ------- C1 ------- Inf-- ------ 7Per -------- 0.05 ------ 6 ----- AEC2--02/25/2009
Bob ------- C1 --- ---- Inf -------- 7Per -------- 0.05 ------ 0 ----- PBC2--07/02/2011
Bob ---- --- C2 ------- Com ------ 8Per -------- 0.45 ------ 1 ----- XBC4--09/05/2011
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- AEC2--02/02/2010
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- PBC2--08/14/2012
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 3 ----- ADC2-- 05/05/2001
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 --- --ADC2--08/02/2010
Bob ------- C2 ------- Com ------ 8Per -------- 0.45 ----- -0 ----- BAC2--06/17/2010
Joe -------- C1 ------- Inf --------- 7Per ----- --- 0.05 ------ 0 ----- PBC2--08/14/2012
Joe -------- C1 ------- Inf ------ --- 7Per -------- 0.05 ------ 0 ----- ZTM2--09/05/2011
Joe -------- C1 ----- --Inf --------- 7Per -------- 0.05 ------ 2 ----- QYC2--05/17/2010
Joe ----- --- ------- C1 --------- Inf文件-------- 7Per 0.05 ------ ----- 0 FLC2--3/19/2010
Joe --- ----- ------- C1 --------- Inf文件-------- 7Per 0.05 ------ ----- 1 KSC2--09/05/2011
Joe -------- C1 ------- Inf --------- 7Per -------- 0。05 ------ 0 ----- JYC2-08/14/2012

比方說,我想建立一個查詢來說這樣的話:顯示所有記錄仍然在這個相同的格式:

名稱 --- --- 說明 --- Thresh的 --- 打擊樂 --- 錯誤 --- BP
鮑勃·------ -C1 ------- Inf -------- 7Per -------- 0.05 ----- 16 ----- BAC2,VBE2,AEC2
鮑勃------- ------ C2 ------的COM -------- 8Per 0.45 ------ ------ 4 XBC4,ADC2
Joe -------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 3 ----- -QYC2,KSC2

爲01/01/2009至2011年9月31日

@HansUp的日期範圍可以給您的幫助嗎?

+0

你需要這樣的VBA用戶定義函數。 Allen Browne提供了一個,以及關於如何使用它的詳細示例。 http://allenbrowne.com/func-concat.html – HansUp 2012-02-09 19:28:31

+0

ive按照編譯該功能的步驟,但你能幫我創建我的「選擇」聲明根據我在上面找什麼? – JT2013 2012-02-09 19:52:25

+0

@HansUp我在編譯它時使用了指向 – JT2013 2012-02-09 19:57:43

回答

5

我用於GROUP BY子查詢,其計算ERR的總和爲每個組。然後我添加了ConcatRelated函數(from Allen Browne)和子查詢返回的字段。這是從查詢的查詢和所述輸出(基於make_table_bp示例數據):

SELECT 
    sub.[Name], 
    sub.Cat, 
    sub.[Desc], 
    sub.Thresh, 
    sub.Perc, 
    sub.SumOfErr, 
    ConcatRelated("BP", 
     "make_table_bp", 
     "[Err] > 0 AND [Name] = '" & sub.[Name] 
     & "' AND Cat = '" 
     & sub.Cat & "'", 
     "BP") 
     AS concat_BP 
FROM 
    (SELECT 
     q.[Name], 
     q.Cat, 
     q.[Desc], 
     q.Thresh, 
     q.Perc, 
     Sum(q.[Err]) AS SumOfErr 
    FROM make_table_bp AS q 
    GROUP BY 
     q.[Name], 
     q.Cat, 
     q.[Desc], 
     q.Thresh, 
     q.Perc 
    ) AS sub 
ORDER BY 
    sub.Name, 
    sub.Cat; 

查詢輸出該結果集:

Name Cat Desc Thresh Perc SumOfErr concat_BP 
Bob C1 Inf 7Per 0.05  16 AEC2, BAC2, VBE2 
Bob C2 Com 8Per 0.45  4 ADC2, XBC4 
Joe C1 Inf 7Per 0.05  3 KSC2, QYC2 

通知我括名稱,說明和Err用方括號括起它們在查詢中引用的每個地方。全部是保留字(參見Problem names and reserved words in Access)。如果可能,請爲這些字段選擇不同的名稱如果不是,請使用方括號以避免混淆數據庫引擎。

但是,這是行不通的,除非/直到你的ConcatRelated功能的副本由你的數據庫引擎的認可。我不明白爲什麼它不是;我遵循您列出的用於存儲功能代碼的相同步驟,並且在我的系統上可以正常工作。

編輯:我用我的版本的表格測試了這個查詢,該表格有一個[Err]作爲數字數據類型。聽起來像你的是文字。在這種情況下,我建議你將你的數字改爲數字。我沒有看到將數值存儲爲文本而不是實際數字的好處。

但是,如果你堅持[ERR]作爲文本,可以適應查詢來對付它。改變了...

"[Err] > 0 AND [Name] = '" & sub.[Name] 

此...

"Val([Err]) > 0 AND [Name] = '" & sub.[Name] 

即變化防止「數據類型不匹配條件表達式中」的錯誤時,我與[ERR]測試作爲文本數據類型。不過,我也改變了這個...

Sum(q.[Err]) AS SumOfErr 

這個...

Sum(Val(q.[Err])) AS SumOfErr 

AFAICT是第二個變化是不是絕對必要的。數據庫引擎似乎願意接受數字作爲文本,當你問他們Sum()他們。不過,我更願意將它們明確地轉換爲數值,而不是依靠數據庫引擎爲我做出正確的猜測。數據庫引擎有足夠的其他東西來處理,所以我試圖正確地告訴它我想要什麼。

編輯2:如果您只想要連接唯一值,則可以修改ConcatRelated()函數。查找此部分代碼...

'Build SQL string, and get the records. 
strSql = "SELECT " & strField & " FROM " & strTable 

,並更改爲這個...

'Build SQL string, and get the records. 
strSql = "SELECT DISTINCT " & strField & " FROM " & strTable 
+0

當我運行上述我得到以下錯誤:錯誤3464:標準表達式中的數據類型不匹配....每個字段都有一個文本數據類型,除了Perc字段,這是一個數字 – JT2013 2012-02-10 20:52:21

+0

你是一個天才!這就像一個魅力!我唯一的問題是:有沒有辦法在concat_BP列中創建只有記錄的記錄? – JT2013 2012-02-13 16:20:19

+0

非常感謝你的幫助......我已經得到了我需要的數據! – JT2013 2012-02-13 17:04:09