मैं एक्सेल में दो तालिकाओं को कैसे मिलाता हूं जिनमें समान कॉलम होते हैं?


11

एक्सेल में, मेरे पास एक स्प्रेडशीट है जो SQL डेटाबेस से डेटा को एक तालिका में खींचती है और फिर उस डेटा के आधार पर एक रिपोर्ट तैयार करती है। दुर्भाग्य से, इस SQL ​​डेटाबेस में डेटा अधूरा है और मैं परिणाम सेट में अतिरिक्त पंक्तियों को शामिल करना चाहता हूं जो कि स्प्रेडशीट में मैन्युअल रूप से दर्ज किए गए हैं।

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


उदाहरण:

Table 1 (From Database):

  | Person | Week Of | Task | Hours |
  | Bob    | 1/6/13  | Foo  | 12    |
  | Mary   | 1/6/13  | Foo  | 7     |
  | Mary   | 1/6/13  | Bar  | 5     |
  | John   | 1/6/13  | Foo  | 5     |
  | John   | 1/13/13 | Foo  | 13    |

-

Table 2 (Entered Manually): 
  | Person | Week Of | Task | Hours |
  | Bob    | 1/6/13  | Baz  | 3     |
  | Mary   | 1/6/13  | Baz  | 2     |
  | John   | 1/13/13 | Baz  | 5     |

-

Result:
  | Person | Week Of | Task | Hours |
  | Bob    | 1/6/13  | Foo  | 12    |
  | Mary   | 1/6/13  | Foo  | 7     |
  | Mary   | 1/6/13  | Bar  | 5     |
  | John   | 1/6/13  | Foo  | 5     |
  | John   | 1/13/13 | Foo  | 13    |
  | Bob    | 1/6/13  | Baz  | 3     |
  | Mary   | 1/6/13  | Baz  | 2     |
  | John   | 1/13/13 | Baz  | 5     |

यदि आपके मैन्युअल रूप से जोड़ा गया डेटा आपके SQL डेटा से कम है तो क्या यह आपके लिए ठीक है? या क्या उन्हें तिथि के अनुसार हल करना होगा। Excel उन पंक्तियों को अधिलेखित नहीं करेगा जो मौजूदा SQL डेटा पंक्तियों के ठीक नीचे हैं। लेकिन यदि दोनों डेटा प्रकारों को क्रमबद्ध करना है, तो पूरी बात अधिक जटिल है।
निक्सन

ठीक है, मैं पसंद करूँगा कि उन्हें क्रमबद्ध किया जाए लेकिन यह पूरी तरह से आवश्यक नहीं है। महत्वपूर्ण बात यह है कि मैं संपूर्ण डेटा सेट (मैन्युअल रूप से और स्वचालित रूप से आबादी वाले तालिकाओं सहित) का विश्लेषण करने के लिए पिवट टेबल और अन्य एक्सेल टूल का उपयोग करने में सक्षम हूं। मुझे SQL से नए डेटा को स्वचालित रूप से खींचने के लिए जारी रखने में भी सक्षम होना चाहिए।
Ajedi32

क्या यह व्यवहार एक समाधान होगा? बाद पहली क्वेरी और बाद दूसरा क्वेरी । और जब आप वर्कबुक खोलते हैं तो एक्सेल आपके एसक्यूएल को ऑटो अपडेट कर देगा।
निकदा

मुझे लगता है कि काम करेगा। मेरे पास एक ही तालिका में डेटा है, इसलिए मैं फ़िल्टर कर सकता हूं, सॉर्ट कर सकता हूं, आदि, लेकिन जैसा मैंने पहले कहा था कि पूरी तरह से आवश्यक नहीं है।
Ajedi32

हो सकता है कि हम आपकी छँटाई समस्या का हल खोज लें। लेकिन पहले चरण के लिए, अपनी SQL को पहली बार किसी नई कार्यपुस्तिका में क्वेरी करें। उसके बाद, उनके ठीक नीचे अपनी मैन्युअल प्रविष्टियाँ जोड़ें। अब एक दूसरी (और अधिक से अधिक) क्वेरी के साथ इसका परीक्षण करें। उन्हें अधिलेखित नहीं किया जाएगा। इसका एक मानक व्यवहार है। करने के लिए कुछ खास नहीं है।
निक्षय

जवाबों:


2

यहाँ कोई VBA के साथ एक शुद्ध एक्सेल समाधान है। यह एक इंडेक्स फ़ंक्शन का उपयोग करके मूल्यों को समाप्त होने और एक त्रुटि स्थिति के परिणाम तक पंक्तियों और एसक्यूएल डेटा के कॉलम के पार करने के लिए काम करता है। IFERROR फ़ंक्शन त्रुटि को पकड़ता है और पंक्तियों को मैन्युअल रूप से दर्ज किए गए डेटा के स्तंभों के पार करने के लिए एक दूसरा INDEX फ़ंक्शन का उपयोग करता है, फिर से उन मानों को समाप्त होने तक और एक त्रुटि स्थिति परिणाम। एक दूसरा IFERROR फ़ंक्शन त्रुटि पकड़ता है और एक डैश ("-") देता है। (SQL डेटा सही परिणाम उत्पन्न करने के लिए सूत्रों के लिए रिबन के माध्यम से ताज़ा किया जाना चाहिए।)

सूत्र का उपयोग करके Sheet1 में SQL डेटा के लिए SQLDB एक डायनामिक नाम श्रेणी बनाएँ

=OFFSET(Sheet1!$A$2,0,0,COUNTA(Sheet1!$A:$A)-1,COUNTA(Sheet1!$1:$1))

बनाएं Sheet2 में मैन्युअल रूप से दर्ज किया गया डेटा सूत्र का उपयोग कर के लिए रेंज EXCELRNG नाम के एक दूसरे गतिशील:

=OFFSET(Sheet2!$A$1,1,0,COUNTA(Sheet2!$A:$A)-1,COUNTA(Sheet2!$1:$1))

इन दोनों नामित श्रेणियां मानती हैं कि चर नाम दो शीटों में से प्रत्येक की पंक्ति 1 में दर्ज किए गए हैं।

शीट 3 की पंक्ति 1 (सेल A1 में शुरुआत) में चर नाम दर्ज करें

पत्रक 3 के सेल A2 में निम्न सूत्र दर्ज करें :

=IFERROR(INDEX(SQLDB,ROWS(A$2:A2),COLUMN(A2)),IFERROR(INDEX(EXCELRNG,ROWS(A$2:A2)-ROWS(SQLDB),COLUMN(A2)),"-"))

चर नाम स्तंभों में सूत्र की प्रतिलिपि बनाएँ , और तब तक पंक्तियों को नीचे करें जब तक कि सूत्र के परिणाम सभी डैश नहीं होते हैं ("-")।

विश्लेषण और संगठन के लिए एक अन्य शीट में पिवट टेबल बनाने के लिए अगले चरण के रूप में संभव है।

नामांकित श्रेणी के लिए नाम प्रबंधक इनपुट बॉक्स में निम्न सूत्र सम्मिलित करते हुए, RESULTRNG, डायनामिक नाम की श्रेणी बनाने के लिए पहला कदम होगा।

=OFFSET(Sheet3!$A$1,0,0,COUNTA(Sheet1!$A:$A)+COUNTA(Sheet2!$A:$A)-1,COUNTA(Sheet1!$1:$1))

फिर एक नई शीट में एक पिवट टेबल बनाएं, RESULTRNG को उस तालिका के रूप में सेट करें जिसे आप विश्लेषण करना चाहते हैं। यह शीट 3 में सूत्र तालिका से किसी भी अनुगामी डैश को फ़िल्टर करेगा।

यह काम करता है क्योंकि RESULTRNG फॉर्मूला शीट 1 और शीट 2 (शीट 2 में हेडर को छोड़कर) और शीट 1 में कॉलम की कुल संख्या को गिनता है, और किसी भी अनुगामी पंक्तियों में किसी भी चकत्ते को छोड़कर उन गणनाओं के आधार पर अपनी सीमा निर्धारित करता है ( या कॉलम) शीट 3 सूत्र तालिका में।


अगर मैंने इसे इस तरह से किया है, तो संयुक्त तालिका का एक निश्चित आकार नहीं होगा? और अगर मेज को जरूरत से ज्यादा बड़ा कर दिया, तो क्या इससे मुझे कोई गड़बड़ नहीं होगी अगर मैंने संयुक्त तालिका से डेटा को संभालने वाली पिवट टेबल बनाने की कोशिश की? (क्योंकि तालिका में कुछ मान '-' वर्ण होंगे?) या इन समस्याओं के आसपास कोई रास्ता है?
Ajedi32

(Btw, मैं आम तौर पर इस तरह के रूप में शुद्ध एक्सेल समाधान पसंद करते हैं क्योंकि उन्हें उपयोगकर्ता को मैक्रो को काम करने से पहले सक्षम करने की आवश्यकता नहीं होती है।)
Ajedi32

यह सुनिश्चित करने के लिए कुछ हाथ-रखरखाव की आवश्यकता होगी कि सूत्र दो तालिकाओं में सभी डेटा को कैप्चर करें। डैश से बचने के लिए, आपको केवल उन फॉर्मूलों को कॉपी करना होगा जहाँ उन्होंने डेटा लौटाया है, डैश नहीं।
गंवार

क्या एक और नामांकित श्रेणी बनाना संभव होगा, जिसमें मर्ज की गई तालिका से केवल वे पंक्तियाँ शामिल हैं जो रिक्त नहीं हैं ('-' वर्णों से भरी हुई)? इस तरह मैं उस सीमा से अपना डेटा प्राप्त करने के लिए केवल पिवट टेबल सेट कर सकता था और मुझे डैश के बारे में चिंता करने की आवश्यकता नहीं थी।
अजादि ३२

मैंने अपने उत्तर का विस्तार यह बताने के लिए किया है कि आप डैश को छोड़कर एक पिवट टेबल कैसे बना सकते हैं। "डैश-कम" तालिका डालने की कोशिश करने से डैश की कोशिकाओं में # एन / ए के साथ डैश समस्या को दूसरी शीट में स्थानांतरित कर दिया जाएगा, जब तक कि स्रोत डेटा में पंक्तियों की संख्या में हर बार नई तालिका हाथ से आकार में न हो।
गंवार

5

मुझे इसे करने का एक तरीका मिला। यह समाधान थोड़ा मुश्किल है और इसके लिए दोनों तालिकाओं के लिए अपनी अलग शीट (उन पर और कुछ नहीं) की आवश्यकता होती है, लेकिन इसके अलावा यह लगभग वही करता है जो मैं चाहता हूं। (अधिक जटिल ऑपरेशन जैसे जॉइन करने के लिए भी यहां काफी संभावनाएं हैं।)

रिबन पर डेटा टैब पर जाएं, "अन्य स्रोतों से", और "Microsoft क्वेरी से" पर क्लिक करें। फिर एक्सेल फाइल्स पर क्लिक करें, उस फाइल को चुनें जिसे आप अभी काम कर रहे हैं और ठीक क्लिक करें। फिर, हिट रद्द करें और जब आप Microsoft क्वेरी में संपादन जारी रखना चाहते हैं, तो "हां" पर प्रचारित करें। यहां से आप SQL बटन पर क्लिक कर सकते हैं और स्प्रैडशीट में किसी भी शीट पर एक कस्टम SQL क्वेरी लिख सकते हैं। मेरे मामले में:

SELECT *
FROM `'Sheet1$'` `'Sheet1$'`
UNION ALL
SELECT *
FROM `'Sheet2$'` `'Sheet2$'`

नोट: मेरे लिए, फ़ाइल बंद करने और उसे फिर से खोलने के बाद यह विधि काम करना बंद कर देती है। मैं इसे वैसे भी यहां पोस्ट कर रहा हूं, हालांकि यह मेरे कंप्यूटर के साथ सिर्फ एक समस्या है या किसी और को काम करने के लिए मिल सकती है।


1
यह दो अलग कार्यपुस्तिकाओं को जोड़ने के लिए ठीक काम करता है। ठीक वैसा ही मुझे चाहिए था। धन्यवाद!
दाविए

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

यह जोड़ने के कारण कि यह वास्तव में मेरे साथ हुआ था, लगभग कुछ योग प्राप्त करने के लिए एक सस्ता बनाने से पहले लगभग 1 स्प्रेडशीट में बिक्री डेटा का एक गुच्छा मर्ज करने के लिए इसका इस्तेमाल किया था, और मुझे कुछ गलतियाँ मिलेंगी जहां एक उत्पाद का एक ही वॉल्यूम कई बार बेचा जाता है याद किया गया।
Some_Guy

@Some_Guy इसके बजाय केवल सभी का उपयोग करें।
अजादी ३२

3

यदि आप VBA समाधान में रुचि रखते हैं, तो मैं निम्नलिखित कार्य करने में सक्षम था:

  • SQL सर्वर से आपके द्वारा खींचे जा रहे डेटा के लिए एक डायनामिक नाम श्रेणी निर्धारित करें। नाम प्रबंधक खोलें, एक नया नाम दर्ज करें, (कहते हैं, "SQLDB") और रिफर्म्स टू इनपुट बॉक्स में निम्न सूत्र को कॉपी करें। मैंने मान लिया है कि आपका खींचा हुआ डेटा शीट 1 में है:

    =OFFSET(Sheet1!$A$1,0,0,COUNTA(Sheet1!$A:$A),COUNTA(Sheet1!$1:$1))
    
  • उस श्रेणी के लिए कोई अन्य नामित सीमा सेट करें जिसमें मैन्युअल डेटा दर्ज किया गया है। मैंने EXCELRNG नाम का उपयोग किया और यह मान लिया कि यह शीट 2 में है। हेडर पंक्ति को बाहर करने के लिए नामित सीमा पंक्ति 2 में शुरू होती है। यहां सूत्र उस शीट को छोड़कर पहले वाले के समान है जो इसे संदर्भित करता है:

    =OFFSET(Sheet2!$A$1,1,0,COUNTA(Sheet2!$A:$A)-1,COUNTA(Sheet2!$1:$1))
    
  • यहां सेटिंग्स का पहला सेट है जो मैंने एसक्यूएल टेबल के कनेक्शन के लिए उपयोग किया था। रिबन पर डेटा टैब में कनेक्शन का चयन करके संवाद बॉक्स तक पहुँचा जाता है। बैकग्राउंड रिफ्रेशिंग को डिसेबल करना यह सुनिश्चित करता है कि एक्सेल शीट में डेटा का रिफ्रेश पूरा होने तक VBA मैक्रो रुक जाए। कार्यपत्रक के खुलने पर कनेक्शन ताज़ा होने की आवश्यकता नहीं हो सकती है, लेकिन मैं यह सुनिश्चित करना चाहता था कि मैक्रो चलाने से पहले कोई भी प्रमाणीकरण किया जाएगा।

संपर्क व्यवस्था

  • यहां सेटिंग्स का दूसरा सेट दिया गया है। ये डेटा टैब के गुण अनुभाग में पाए जाते हैं (जबकि आयातित SQL तालिका में एक सेल का चयन किया जाता है)। हालांकि मैंने "नए डेटा के लिए संपूर्ण पंक्तियाँ सम्मिलित करें, अप्रयुक्त कोशिकाओं को हटाएं" विकल्प को चुना, मैं वास्तव में "सेल सम्मिलित करें ..." विकल्प के साथ किसी भी परेशानी में नहीं चला।

कनेक्शन गुण

  • अंत में, यह VBA कोड है। इसे डालने के लिए, डेवलपर टैब के तहत विजुअल बेसिक चुनें। बाईं ओर सूची में वर्कशीट नाम हाइलाइट करें। इसे "VBA प्रोजेक्ट (शीट नाम)" के रूप में संदर्भित किया जाएगा। फिर स्क्रीन के शीर्ष पर मेनू बार में इन्सर्ट मॉड्यूल चुनें, और नए मॉड्यूल में कोड पेस्ट करें। ध्यान दें कि मैंने समेकित तालिका Sheet3 में लिखी है। मैक्रो नई तालिका को सॉर्ट नहीं करता है, हालांकि इसे जोड़ना मुश्किल नहीं होगा।

    Sub StackTables()
    
       Dim Rng1 As Range, Rng2 As Range
    
       Set Rng1 = ThisWorkbook.Names("SQLDB").RefersToRange
       Set Rng2 = ThisWorkbook.Names("EXCELRNG").RefersToRange
    
       ' refresh the SQL table
       ThisWorkbook.Connections(1).Refresh
    
       ' clear the consolidated table range  
       Sheet3.Cells.ClearContents
    
       ' copy the SQL data into the consolidation range
       Rng1.Copy
       Sheet3.Range("A1").PasteSpecial xlPasteValues
    
       'copy the manually entered data into the consolidate range
       Rng2.Copy
       Sheet3.Range("A1").Offset(Rng1.Rows.Count, 0).PasteSpecial xlPasteValues
       Application.CutCopyMode = False
    
       Sheets("Sheet3").Activate
       ActiveSheet.Range("A1").Select
    
    End Sub
    

यह एक बहुत ठोस समाधान की तरह दिखता है। हालांकि मेरे पास कुछ सवाल हैं। इस मैक्रो को क्या ट्रिगर करता है? जब आप डेटा कनेक्शन को रिफ्रेश करते हैं तो यह स्वचालित रूप से चलता है, या क्या आपको इसे मैन्युअल रूप से चलाने के लिए एक अलग बटन पुश करना होगा? दूसरे, यह सही तालिकाओं के साथ काम करता है? (न केवल पर्वतमाला जो तालिकाओं के रूप में स्वरूपित नहीं होती हैं) यदि ऐसा है, तो क्या तालिका स्वयं छँटाई नहीं कर सकती है? (VBA मैक्रो के बजाय सॉर्टिंग कर रहे हैं, जैसा कि आपने सुझाव दिया है?)
Ajedi32

1
जैसा कि यह खड़ा है, आप डेवलपर टैब से मैक्रोज़ का चयन करके मैक्रो को चलाएंगे और फिर मैक्रो का चयन और चलाएंगे। दो विकल्प: रिबन पर एक कस्टम बटन को असाइन करें और इसे चलाने के लिए उपयोग करें; या इसे वर्कशीट_एक्टिवेट इवेंट में मैक्रो कोड के रूप में एम्बेड करें। जब भी आप समेकन पत्र का चयन करते हैं तो यह इसे चलाएगा। यह तालिकाओं के साथ काम करेगा, जो छंटाई कर सकता है। हालाँकि, मुझे यकीन नहीं है कि जब डेटा जोड़ा जाता है तो टेबल स्वचालित रूप से सहारा लेते हैं।
गंवार

3

यहाँ @ चफ़ के "शुद्ध एक्सेल" समाधान का एक संस्करण है जिसे विशेष रूप से तालिकाओं के साथ काम करने के लिए डिज़ाइन किया गया है। (IE आप विलय करना चाहते हैं दो डेटा स्रोत टेबल हैं।)

इस विधि और उनके उत्तर में तैनात एक कश के बीच मुख्य अंतर यह है कि आपको उन दो डेटा सेटों के लिए नामित श्रेणियों को परिभाषित करने की आवश्यकता नहीं है जिन्हें आप विलय कर रहे हैं, क्योंकि वे टेबल हैं और पहले से ही उनकी खुद की नामित सीमा है। इसलिए आगे बढ़ें और अपनी पहली तालिका Table1, और अपनी दूसरी तालिका को नाम दें Table2

अब, एक नई शीट के ऊपरी-बाएँ कोने में एक नई तालिका बनाएं और इसे अन्य दो तालिकाओं के समान स्तंभ नाम दें। फिर आपके द्वारा बनाई गई शीट के सेल A2 में निम्नलिखित सूत्र दर्ज करें:

=IFERROR(INDEX(Table1,ROWS(A$2:A2),COLUMN(A2)), IFERROR(INDEX(Table2,ROWS(A$2:A2)-ROWS(Table1),COLUMN(A2)), "-"))

अगला, सभी तालिका स्तंभों पर इस सूत्र की प्रतिलिपि बनाएँ, और तब तक पंक्तियों को नीचे करें जब तक कि सूत्र के परिणाम सभी डैश नहीं होते हैं ("-")। नोट: इस नई तालिका को क्रमबद्ध करने से कुछ नहीं होगा, क्योंकि प्रत्येक कक्ष की सामग्री वास्तव में समान होती है (वे सभी समान सूत्र होते हैं)।

यदि मर्ज की गई तालिका में कॉलम 0 है, जब उन्हें एक रिक्त कक्ष प्रदर्शित किया जाना चाहिए, तो आप उस स्तंभ में सूत्र को इस प्रकार से प्रतिस्थापित कर सकते हैं, जैसे:

=SUBSTITUTE(<old expression here>, 0, "")

यदि आप इस नई तालिका के डेटा का उपयोग करने वाली एक धुरी तालिका बनाना चाहते हैं, तो आपको एक नामांकित श्रेणी बनानी होगी। सबसे पहले, तालिका को नाम दें Table3। अब, सूत्र टैब पर जाएं और "नाम निर्धारित करें" पर क्लिक करें। संदर्भ को एक नाम दें, इसके मान के लिए निम्नलिखित समीकरण दर्ज करें ("संदर्भित करता है"):

=OFFSET(Table3[#All],0,0,ROWS(Table1)+ROWS(Table2)+1)

फिर आप इस नामांकित संदर्भ को अपनी पिवट टेबल की सीमा के रूप में उपयोग कर सकते हैं।


0

यदि आप केवल एक बार के आधार पर परिणाम चाहते हैं, तो एक वेब साइट है जो आपके लिए दो तालिकाओं का विलय करेगी: https://office-tools.online/table/merge/

आप वेब पेज में तालिकाओं को चिपकाते हैं और संबंधित मापदंडों का चयन करते हैं। यहाँ अंतर्निहित उदाहरण का एक स्क्रीनशॉट है जो इंगित करता है कि इसका उपयोग कैसे किया जाए:

यहाँ छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.