2011-04-01 111 views
17

假設我有表中訪問毫秒以下信息:女士訪問查詢:通過查詢串聯行

ColumnA ColumnB 
1  abc 
1  pqr 
1  xyz 
2  efg 
2  hij 
3  asd 

我的問題是,我怎麼可以連接在第二列中的值的行值基於第一列。我想要的查詢結果如下:

ColumnA ColumnB 
1  abc, pqr, xyz 
2  efg, hij 
3  asd 

我想通過查詢來實現這一點。有人可以幫我實現這個目標嗎?

+1

1)標準SQL沒有'Concat'設置功能:什麼將所得到的數據類型是什麼?它會違反1NF嗎?它會是一套嗎?如何查詢這些數據?等等; 2)Access2007引入了多值類型(http://www.theregister.co.uk/2006/07/18/multivalued_datatypes_access/print.html); 3)你有沒有考慮過報告?隨Access一起發貨的是相當不錯的。 – onedaywhen 2011-04-04 13:17:58

回答

17

您需要一個函數來進行串接。

Microsoft Access condense multiple lines in a table

示例使用您的數據:

Select T.ColumnA 
    , GetList("Select ColumnB From Table1 As T1 Where T1.ColumnA = " & [T].[ColumnA],"",", ") AS ColumnBItems 
From Table1 AS T 
Group By T.ColumnA; 
+0

我需要在查詢中實現此功能,而不是vba功能。我在我的問題中已經說過了。 – reggie 2011-04-01 18:37:16

+5

閱讀該鏈接。您可以創建一個函數並在查詢中使用該函數。否則無法做到這一點。 – Thomas 2011-04-01 18:37:50

+1

但是,反正只有在查詢中才有它嗎? – reggie 2011-04-01 18:38:40

2

這可能是很難獲得。如果你必須在查詢中而不是函數中執行,那麼你將遇到的問題是可以連接成一列的行數的限制。到目前爲止,我發現實現這一目標的唯一方法是通過iif語句。

SELECT 
test1.ColumnA AS ColumnA, 
First([test1].[ColumnB]) & IIf(Count([test1].[ColumnB])>1,"," & Last([test1].[ColumnB])) AS ColumnB 
FROM test1 
GROUP BY test1.ColumnA; 

回報:

ColumnA ColumnB 
1  abc,xyz 
2  efg,hij 
3  asd 

這將返回第一個也是唯一的最後一個,但我敢肯定有,你可以制定出選擇功能一點的工作,但就像我說你會爲每一個你想添加的項目添加更多的iif語句,因此限制。

+0

是的。如果您能爲我發佈解決方案,我將非常感激。 – reggie 2011-04-01 18:36:40

+1

@reggie - 上述解決方案的問題是未知數的子項目。現在,每個項目只有2列B值。有10個時會發生什麼? 100? – Thomas 2011-04-01 18:44:16

+0

最終..它由您計劃有多少項目決定......如果columnA值可以有20個項目分組在columnB中......這可能不是您最好的解決方案......如果您以2-3的可能性來看。 – Patrick 2011-04-01 18:49:19

5

下面是一個優秀的鏈接:如何通過調用函數從SQL內部完成此操作。該指令非常清晰&該功能是爲你寫的,所以你可以複製,粘貼&去。甚至有人沒有VB的知識,可以很容易地實現它: Concatenate values from related records

0

表可以有一個順序列,這使得它ColumnA序列中唯一的主鍵:

table: t1 
ColumnA sequence ColumnB 
1  1  abc 
1  2  pqr 
1  3  xyz 
2  1  efg 
2  2  hij 
3  1  asd 

而且交叉表可能是創建:

query: x1 
TRANSFORM Min([columnB] & ", ") AS Expr1 
SELECT t1.columnA 
FROM t1 
GROUP BY t1.columnA 
PIVOT t1.sequence; 

columnA 1 2 3 
1  abc, pqr, xyz, 
2  efg, hij, 
3  asd, 

然後,最終的查詢可以結合列和刪除最後一個逗號:

SELECT x1.columnA, Left([1] & [2] & [3],Len([1] & [2] & [3])-2) AS columnB FROM x1; 

columnA columnB 
1  abc, pqr, xyz 
2  efg, hij 
3  asd 

要自動化序列中充填,下面VBA代碼可用於:

Sub fill_sequence_t1() 
    Dim i: i = 1 
    Do While DCount("*", "t1", "sequence IS NULL") > 0 
    DoCmd.RunSQL "SELECT t1.columnA, Min(t1.columnB) AS columnB_min INTO t2" & _ 
       " FROM t1 WHERE t1.sequence IS NULL GROUP BY t1.columnA;" 
    DoCmd.RunSQL "UPDATE t1 INNER JOIN t2 ON (t1.columnA = t2.columnA)" & _ 
       " AND (t1.columnB = t2.columnB_min) SET t1.sequence=" & i 
    CurrentDb.TableDefs.Delete "t2" 
    i = i + 1 
    Loop 
End Sub