2011-04-01 17 views
17

मान लीजिए मैं निम्नलिखित जानकारी के साथ सुश्री Access में तालिका है:सुश्री पहुँच क्वेरी: एक प्रश्न के माध्यम से पंक्तियाँ श्रृंखलाबद्ध

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' समारोह सेट: परिणामी डेटा प्रकार क्या होगा? क्या यह 1 एनएफ का उल्लंघन करेगा? क्या यह एक सेट होगा? इस तरह के डेटा पूछताछ कैसे किया जा सकता है? आदि; 2) Access2007 ने बहु-मूल्यवान प्रकारों की शुरुआत की (http://www.theregister.co.uk/2006/07/18/multivalued_datatypes_access/print.html); 3) क्या आपने एक रिपोर्ट माना है? एक्सेस के साथ जहाजों में से एक बहुत अच्छा है। – onedaywhen

उत्तर

17

आपको concatenation करने के लिए एक फ़ंक्शन की आवश्यकता है।

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

+5

उस लिंक को पढ़ें। आप एक फंक्शन बनायेंगे और अपनी क्वेरी में फ़ंक्शन का उपयोग करेंगे। अन्यथा ऐसा करने का कोई तरीका नहीं है। – Thomas

+1

लेकिन क्या इसके बजाय केवल क्वेरी में ऐसा करने के लिए नहीं है? – reggie

2

इस प्राप्त करने के लिए बहुत मुश्किल हो सकता है। यदि आपको इसे किसी क्वेरी में करना चाहिए और फ़ंक्शन नहीं है, तो जिस समस्या में आप भाग लेंगे वह पंक्तियों की संख्या की सीमा है जो आप एक कॉलम में जोड़ सकते हैं। अब तक यह हासिल करने का एकमात्र तरीका आईआईएफ कथन के माध्यम से है।

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 

यह पहली और केवल पिछले वापस आ जाएगी, लेकिन मैं एक छोटे से काम तुम बाहर काम कर सकता समारोह चुनें के साथ यकीन है, लेकिन जैसा कि मैंने कहा था कि आप के लिए होता है आप जो अतिरिक्त आइटम जोड़ना चाहते हैं, उसके लिए अधिक आईआईएफ स्टेटमेंट जोड़ने के लिए, इसलिए सीमा।

+0

हाँ। अगर आप मेरे लिए उस समाधान को पोस्ट कर सकते हैं तो मैं वास्तव में सराहना करता हूं। – reggie

+1

@reggie - उपर्युक्त समाधान के साथ समस्या यह है कि बच्चे आइटम की अज्ञात संख्या। अभी, प्रत्येक आइटम में केवल 2 कॉलम बी मान हैं। क्या होता है जब 10 होते हैं? 100? – Thomas

+0

आखिरकार .. यह निर्धारित करता है कि आप कितने आइटम पर योजना बना रहे हैं ... यदि कॉलम ए मान में कॉलम बी में समूहित 20 आइटम हो सकते हैं ... यह शायद आपका सबसे अच्छा समाधान नहीं है ... यदि आप 2 - 3 को देख रहे हैं तो यह संभव है। – Patrick

5

यहां एक उत्कृष्ट लिंक है: फ़ंक्शन को कॉल करके SQL के भीतर से इसे कैसे करें। निर्देश असाधारण रूप से स्पष्ट हैं & फ़ंक्शन आपके लिए लिखा गया है ताकि आप कॉपी कर सकें, & पेस्ट करें। यहां तक ​​कि वीबी का ज्ञान नहीं के साथ किसी को आसानी से इसे लागू कर सकते हैं: 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