दिलचस्प पोस्ट
अपाचे HTTP क्लाइंट SSLPeerUnverifiedException CUDA में 2 डी एरेज़ का उपयोग कैसे करें? मैं दो कमानों को एक में कैसे मिला सकता हूं? MATLAB में एक हिस्टोग्राम को सामान्य कैसे करें? जावा में SIGINT कैप्चर करें जावास्क्रिप्ट: कैसे इंटरनेट एक्सप्लोरर में परिवर्तन घटना अनुकरण (प्रतिनिधिमंडल) मूल्य से एक शब्दकोश सॉर्ट करना तो कुंजी फ़ंक्शन पॉइंटर्स और डेटा पॉइंटर्स सी / सी ++ में असंगत क्यों हैं? यह निर्धारित करने के लिए कि क्या कोई प्रकार C # प्रतिबिंब के साथ एक इंटरफ़ेस लागू करता है जावा: जेपीप्रगसरबार (या समतुल्य) जेटबबेडपैन टैब शीर्षक में एक नियंत्रक एक और फोन कर सकते हैं? एमएस एक्सेस के लिए निशुल्क वैकल्पिक समय की तरह एक आर कमांड के माध्यम से कोशिश करो () सूची आइटम मुद्रित करने के लिए पायथनिक तरीका रूबी रत्न मणि निर्भरताओं में (~>) से अधिक टिल्ड-बड़ा क्या होता है?

MySQL – कॉलम के लिए पंक्तियाँ

मैंने पदों की खोज करने की कोशिश की, लेकिन मुझे केवल SQL सर्वर / एक्सेस के लिए समाधान मिल गया मुझे MySQL (5.X) में समाधान की आवश्यकता है।

मेरे पास तीन स्तंभों के साथ तालिका (इतिहास कहा जाता है): होस्टिड, मदनाम, मदमूल्य।
अगर मैं एक चयन ( select * from history ) करता हूं, तो वह वापस आ जाएगी I

  +--------+----------+-----------+ | hostid | itemname | itemvalue | +--------+----------+-----------+ | 1 | A | 10 | +--------+----------+-----------+ | 1 | B | 3 | +--------+----------+-----------+ | 2 | A | 9 | +--------+----------+-----------+ | 2 | c | 40 | +--------+----------+-----------+ 

मैं कैसे कुछ की तरह वापसी करने के लिए डेटाबेस पूछना है

  +--------+------+-----+-----+ | hostid | A | B | C | +--------+------+-----+-----+ | 1 | 10 | 3 | 0 | +--------+------+-----+-----+ | 2 | 9 | 0 | 40 | +--------+------+-----+-----+ 

Solutions Collecting From Web of "MySQL – कॉलम के लिए पंक्तियाँ"

मैं इस समस्या को हल करने के लिए कुछ और अधिक विस्तृत और विस्तृत विवरण जोड़ने के लिए जा रहा हूं। मैं माफी चाहता हूं अगर यह बहुत लंबा है


मैं आपके द्वारा दिए गए आधार के साथ शुरू कर दूँगा और कुछ शर्तों को परिभाषित करने के लिए इसका उपयोग करूँगा जो मैं इस शेष पोस्ट के लिए उपयोग करूंगा। यह आधार सारणी होगी :

 select * from history; +--------+----------+-----------+ | hostid | itemname | itemvalue | +--------+----------+-----------+ | 1 | A | 10 | | 1 | B | 3 | | 2 | A | 9 | | 2 | C | 40 | +--------+----------+-----------+ 

यह हमारा लक्ष्य होगा, सुंदर पिवट तालिका :

 select * from history_itemvalue_pivot; +--------+------+------+------+ | hostid | A | B | C | +--------+------+------+------+ | 1 | 10 | 3 | 0 | | 2 | 9 | 0 | 40 | +--------+------+------+------+ 

history.hostid कॉलम में मान पिवट तालिका में y- मान हो जाएंगे। history.itemname कॉलम में मान X-values बनेंगे (स्पष्ट कारणों के लिए)।


जब मुझे एक धुरी सारणी बनाने की समस्या को हल करना है, तो मैं इसे तीन-चरणीय प्रक्रिया (एक वैकल्पिक चौथे चरण के साथ) का उपयोग कर हल करता हूं:

  1. हित के कॉलम, यानी y- मान और एक्स-वैल्यू चुनें
  2. अतिरिक्त कॉलम के साथ आधार तालिका का विस्तार – प्रत्येक एक्स-वैल्यू के लिए एक
  3. समूह और समस्त विस्तृत तालिका – प्रत्येक वाई-मान के लिए एक समूह
  4. (वैकल्पिक) एकत्रित तालिका को ढंकना

चलिए अपनी समस्या पर इन चरणों को लागू करते हैं और देखें कि हम क्या प्राप्त करते हैं:

चरण 1: रुचि के कॉलम चुनें वांछित परिणाम में, hostid y-values प्रदान करता है और itemname एक्स-वैल्यू प्रदान करता है।

चरण 2: अतिरिक्त कॉलम के साथ आधार तालिका का विस्तार करें । हमें आम तौर पर प्रति x-value एक स्तंभ की आवश्यकता होती है याद रखें कि हमारे x- मान स्तंभ itemname का itemname :

 create view history_extended as ( select history.*, case when itemname = "A" then itemvalue end as A, case when itemname = "B" then itemvalue end as B, case when itemname = "C" then itemvalue end as C from history ); select * from history_extended; +--------+----------+-----------+------+------+------+ | hostid | itemname | itemvalue | A | B | C | +--------+----------+-----------+------+------+------+ | 1 | A | 10 | 10 | NULL | NULL | | 1 | B | 3 | NULL | 3 | NULL | | 2 | A | 9 | 9 | NULL | NULL | | 2 | C | 40 | NULL | NULL | 40 | +--------+----------+-----------+------+------+------+ 

ध्यान दें कि हमने पंक्तियों की संख्या नहीं बदली – हमने अतिरिक्त कॉलम जोड़े इसके अलावा नोट्स की पैटर्न को ध्यान में रखें – itemname = "A" साथ एक पंक्ति itemname = "A" में नए कॉलम A लिए एक गैर-रिक्त मूल्य और अन्य नए कॉलम के लिए शून्य मान हैं।

चरण 3: ग्रुप और समस्त विस्तृत तालिका हमें group by hostid की आवश्यकता है, क्योंकि यह y- मान प्रदान करता है:

 create view history_itemvalue_pivot as ( select hostid, sum(A) as A, sum(B) as B, sum(C) as C from history_extended group by hostid ); select * from history_itemvalue_pivot; +--------+------+------+------+ | hostid | A | B | C | +--------+------+------+------+ | 1 | 10 | 3 | NULL | | 2 | 9 | NULL | 40 | +--------+------+------+------+ 

(ध्यान दें कि अब हमारे पास एक पंक्ति प्रति वाई-मूल्य है।) ठीक है, हम लगभग वहां हैं! हमें उन बदसूरत NULL छुटकारा पाने की जरूरत है

चरण 4: आकर्षक बनाना हम शून्य के साथ किसी भी रिक्त मूल्य को बदलने के लिए जा रहे हैं ताकि परिणाम सेट देखने के लिए अच्छा होगा:

 create view history_itemvalue_pivot_pretty as ( select hostid, coalesce(A, 0) as A, coalesce(B, 0) as B, coalesce(C, 0) as C from history_itemvalue_pivot ); select * from history_itemvalue_pivot_pretty; +--------+------+------+------+ | hostid | A | B | C | +--------+------+------+------+ | 1 | 10 | 3 | 0 | | 2 | 9 | 0 | 40 | +--------+------+------+------+ 

और हमने किया – हमने MySQL का इस्तेमाल करते हुए एक अच्छा, सुंदर पिवट तालिका बनाई है


इस प्रक्रिया को लागू करते समय विचार:

  • क्या अतिरिक्त कॉलम में उपयोग करने के लिए मूल्य मैंने इस उदाहरण में itemvalue का उपयोग किया
  • क्या अतिरिक्त कॉलम में उपयोग करने के लिए "तटस्थ" मान मैंने NULL प्रयोग किया NULL , लेकिन यह आपके सटीक स्थिति के आधार पर 0 या "" भी हो सकता है
  • ग्रुपिंग के दौरान उपयोग करने के लिए कौन से समग्र फ़ंक्शन मैंने sum उपयोग किया, लेकिन count और max भी अक्सर उपयोग किया जाता है (एक पंक्ति "ऑब्जेक्ट्स" जो कई पंक्तियों में फैल गया था, निर्माण करते समय max अक्सर उपयोग किया जाता है)
  • y- मान के लिए एकाधिक कॉलम का उपयोग करना यह समाधान y- मान के लिए एक एकल कॉलम का उपयोग करने तक सीमित नहीं है – सिर्फ अतिरिक्त कॉलम को group by में प्लग करें (और उन्हें select लिए मत भूलें)

ज्ञात सीमाएं:

  • यह समाधान पिवट तालिका में एन कॉलम की अनुमति नहीं देता है – आधार तालिका को बढ़ाते समय प्रत्येक ध्रुव स्तंभ को मैन्युअल रूप से जोड़ा जाना चाहिए। तो 5 या 10 x- मान के लिए, यह समाधान अच्छा है। 100 के लिए, इतना अच्छा नहीं है एक प्रश्न पैदा करने वाली संग्रहीत प्रक्रियाओं के साथ कुछ समाधान हैं, लेकिन वे सही होने के लिए बदसूरत और कठिन हैं। मैं वर्तमान में इस समस्या को हल करने का एक अच्छा तरीका नहीं जानता जब पिवट तालिका में बहुत से कॉलम होने चाहिए।
 SELECT hostid, sum( if( itemname = 'A', itemvalue, 0 ) ) AS A, sum( if( itemname = 'B', itemvalue, 0 ) ) AS B, sum( if( itemname = 'C', itemvalue, 0 ) ) AS C FROM bob GROUP BY hostid; 

मैट फेनविक के विचार का फायदा उठाते हुए मुझे समस्या का समाधान करने में मदद मिली (बहुत धन्यवाद), चलो इसे एक ही क्वेरी में कम करें:

 select history.*, coalesce(sum(case when itemname = "A" then itemvalue end), 0) as A, coalesce(sum(case when itemname = "B" then itemvalue end), 0) as B, coalesce(sum(case when itemname = "C" then itemvalue end), 0) as C from history group by hostid 

एक अन्य विकल्प, विशेष रूप से उपयोगी यदि आपके पास बहुत सी चीजें हैं जो आपको धुएं की जरूरत है तो mysql ने आपके लिए क्वेरी का निर्माण करना है:

 SELECT GROUP_CONCAT(DISTINCT CONCAT( 'ifnull(SUM(case when itemname = ''', itemname, ''' then itemvalue end),0) AS `', itemname, '`' ) ) INTO @sql FROM history; SET @sql = CONCAT('SELECT hostid, ', @sql, ' FROM history GROUP BY hostid'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; 

FIDDLE इसे काम करने के लिए कुछ अतिरिक्त मूल्य जोड़े

GROUP_CONCAT का 1000 का एक डिफ़ॉल्ट मान है, यदि आपके पास वास्तव में बड़ा क्वेरी बदलने से पहले यह पैरामीटर बदल जाता है

 SET SESSION group_concat_max_len = 1000000; 

परीक्षा:

 DROP TABLE IF EXISTS history; CREATE TABLE history (hostid INT, itemname VARCHAR(5), itemvalue INT); INSERT INTO history VALUES(1,'A',10),(1,'B',3),(2,'A',9), (2,'C',40),(2,'D',5), (3,'A',14),(3,'B',67),(3,'D',8); hostid ABCD 1 10 3 0 0 2 9 0 40 5 3 14 67 0 8 

मैं Agung Sagita का जवाब subquery से जुड़ने के लिए संपादित करता हूं। मुझे इस बात के बारे में निश्चित नहीं है कि इस 2 मार्ग में कितना अंतर है, लेकिन सिर्फ एक अन्य संदर्भ के लिए।

 SELECT hostid, T2.VALUE AS A, T3.VALUE AS B, T4.VALUE AS C FROM TableTest AS T1 LEFT JOIN TableTest T2 ON T2.hostid=T1.hostid AND T2.ITEMNAME='A' LEFT JOIN TableTest T3 ON T3.hostid=T1.hostid AND T3.ITEMNAME='B' LEFT JOIN TableTest T4 ON T4.hostid=T1.hostid AND T4.ITEMNAME='C' 

उपकुंजी का उपयोग करें

 SELECT hostid, (SELECT VALUE FROM TableTest WHERE ITEMNAME='A' AND hostid = t1.hostid) AS A, (SELECT VALUE FROM TableTest WHERE ITEMNAME='B' AND hostid = t1.hostid) AS B, (SELECT VALUE FROM TableTest WHERE ITEMNAME='C' AND hostid = t1.hostid) AS C FROM TableTest AS T1 GROUP BY hostid 

लेकिन यह एक समस्या होगी यदि सब क्वेरी परिणाम एक पंक्ति से अधिक हो, तो सबक्वैरी में आगे समेकित फ़ंक्शन का उपयोग करें

मैं इसे Group By hostId में बना देता Group By hostId तो यह मूल्यों के साथ केवल पहली पंक्ति दिखाएगा,
पसंद:

 ABC 1 10 2 3 

यह आपके लिए सटीक उत्तर नहीं है, लेकिन यह एक ऐसा समाधान था जिसका मुझे अपने प्रोजेक्ट पर जरूरी होना था और उम्मीद है कि यह किसी को मदद करता है। यह 1 से एन पंक्ति पंक्ति मदों को अल्पविराम से अलग करेगा। Group_Concat MySQL में यह संभव बनाता है

 select cemetery.cemetery_id as "Cemetery_ID", GROUP_CONCAT(distinct(names.name)) as "Cemetery_Name", cemetery.latitude as Latitude, cemetery.longitude as Longitude, c.Contact_Info, d.Direction_Type, d.Directions from cemetery left join cemetery_names on cemetery.cemetery_id = cemetery_names.cemetery_id left join names on cemetery_names.name_id = names.name_id left join cemetery_contact on cemetery.cemetery_id = cemetery_contact.cemetery_id left join ( select cemetery_contact.cemetery_id as cID, group_concat(contacts.name, char(32), phone.number) as Contact_Info from cemetery_contact left join contacts on cemetery_contact.contact_id = contacts.contact_id left join phone on cemetery_contact.contact_id = phone.contact_id group by cID ) as c on c.cID = cemetery.cemetery_id left join ( select cemetery_id as dID, group_concat(direction_type.direction_type) as Direction_Type, group_concat(directions.value , char(13), char(9)) as Directions from directions left join direction_type on directions.type = direction_type.direction_type_id group by dID ) as d on d.dID = cemetery.cemetery_id group by Cemetery_ID 

इस कब्रिस्तान के दो आम नाम हैं, इसलिए नाम अलग-अलग पंक्तियों में एक आईडी से जुड़े हुए हैं लेकिन दो नाम आईडी हैं और क्वेरी इस तरह कुछ पैदा करता है

कब्रिस्तान Cemetery_Name अक्षांश
1 एपलटन, सल्फेर स्प्रिंग्स 35.4276242832293

मेरा समाधान:

 select h.hostid, sum(ifnull(hA,0)) as A, sum(ifnull(hB,0)) as B, sum(ifnull(hC,0)) as C from ( select hostid, case when itemName = 'A' then itemvalue end as A, case when itemName = 'B' then itemvalue end as B, case when itemName = 'C' then itemvalue end as C from history ) h group by hostid 

यह प्रस्तुत मामले में अपेक्षित परिणाम उत्पन्न करता है।

सरल क्वेरीज़ से मेरी कॉलम लगभग पंक्तियों में परिवर्तित करने के लिए मेरी रिपोर्ट्स को एक तरह से समझाता है आप यहां ऑनलाइन देख सकते हैं और इसका परीक्षण कर सकते हैं ।

क्वेरी के कॉलम की संख्या तय की गई है लेकिन मान गतिशील हैं और पंक्तियों के मानों के आधार पर। आप इसे बना सकते हैं इसलिए, मैं एक क्वेरी का उपयोग तालिका शीर्ष लेख बनाने और एक अन्य मान को देखने के लिए करता हूं:

 SELECT distinct concat('<th>',itemname,'</th>') as column_name_table_header FROM history order by 1; SELECT hostid ,(case when itemname = (select distinct itemname from history a order by 1 limit 0,1) then itemvalue else '' end) as col1 ,(case when itemname = (select distinct itemname from history a order by 1 limit 1,1) then itemvalue else '' end) as col2 ,(case when itemname = (select distinct itemname from history a order by 1 limit 2,1) then itemvalue else '' end) as col3 ,(case when itemname = (select distinct itemname from history a order by 1 limit 3,1) then itemvalue else '' end) as col4 FROM history order by 1; 

आप इसे संक्षेप भी कर सकते हैं:

 SELECT hostid ,sum(case when itemname = (select distinct itemname from history a order by 1 limit 0,1) then itemvalue end) as A ,sum(case when itemname = (select distinct itemname from history a order by 1 limit 1,1) then itemvalue end) as B ,sum(case when itemname = (select distinct itemname from history a order by 1 limit 2,1) then itemvalue end) as C FROM history group by hostid order by 1; +--------+------+------+------+ | hostid | A | B | C | +--------+------+------+------+ | 1 | 10 | 3 | NULL | | 2 | 9 | NULL | 40 | +--------+------+------+------+ 

रेक्सटास्टर के परिणाम:

रेक्सटेस्टर के परिणाम

http://rextester.com/ZSWKS28923

उपयोग के एक वास्तविक उदाहरण के लिए, यह रिपोर्ट कॉलम में दिखाती है कि प्रस्थान के घंटे दृश्य / अनुसूची के साथ नाव / बस के आने वाले हैं। आपको विजुअलाइज़ेशन को भ्रमित किए बिना पिछले कॉल पर उपयोग किए जाने वाले एक अतिरिक्त कॉलम देखेंगे: सिस्टेमा वेन्डे डे पेटाजिन्स ऑनलाइन और उपभोक्ता के अंतिम और नियंत्रण के लिए - एक्सएसएल टेक्नोलॉजी - xsl.com.br ** तिकड़ी प्रणाली को टिकट ऑनलाइन और वर्तमान में बेचने के लिए