2012-08-31 13 views
6

मैंने पिवट तालिका कैसे करें पर स्टैक ओवरफ्लो पर अधिकांश पोस्ट पढ़ी हैं लेकिन सभी पोस्ट कॉलम के पूर्व ज्ञान के साथ उदाहरण दिखाती हैं। अगर आपको कोई जानकारी नहीं है कि कॉलम क्या होगा, तो आप एक प्रश्न कैसे बनाते हैं।स्तंभों के ज्ञान के बिना पिवट तालिका कैसे करें

id  column  value  Row 
1  age   13   1 
2  height  55   1 
3  fav number NULL  1 
4  siblings  4   1 
5  age   55   2 
6  height  54   2 
7  fav number 12   2 

मैं इस उत्पादन के लिए देख रहा हूँ:

row  age  height  fav number  siblings 
1   13  55   NULL    4 
2   55  54   12    NULL 

आप देख सकते हैं कोई पंक्ति 2 वहाँ है भाई बहन के लिए एक प्रविष्टि गुम यहाँ कुछ नमूना डेटा है। क्वेरी के समय कॉलम नाम अज्ञात हैं। आप यह प्रश्न कैसे बनायेंगे।

+2

अज्ञात कॉलम के साथ * परिणाम सेट * का उपयोग करने की योजना कैसे बनाते हैं? – SingleNegationElimination

+0

प्रिय भगवान, यह एक है ... मेटा डीबी ??? (बुरा संगीत: टा टा taaaaaaa) –

+0

@ एड्रियन मैं मेटा डेटाबेस प्यार करता हूँ :) – Kermit

उत्तर

2

मुझे कोई भी तरीका नहीं दिखता है कि आप जो कुछ भी चाहते हैं उसे प्राप्त करने के लिए आप कुछ फैंसी SELECT क्वेरी लिख सकते हैं। आपको कुछ प्री-प्रोसेसिंग करना होगा।


आपके पास कार्यक्रम, आवेदन, स्क्रिप्ट, आदि किसी प्रकार से इस MySQL क्वेरी को क्रियान्वित किया जा करने के लिए सुनिश्चित नहीं हैं कि क्या भाषा है, लेकिन यहाँ मैं PHP में क्या करेंगे है:

/* $data is where our data is going to be stored in our desired format */ 
$data = array(); 
/* $columns is a list of all column names */ 
$columns = array(); 
/* $rows is a list of all row names (probably '1', '2', etc) */ 
$rows = array(); 

$result = mysql_query('SELECT column, value, row FROM TableName'); 
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { 
    /* if this row isn't in $data yet, add it */ 
    if (!array_key_exists($row['row'], $data) { 
    $data[$row['row']] = array(); 
    } 

    /* if this column isn't in $columns yet, add it */ 
    if (!in_array($row['column'], $columns)) { 
    array_push($columns, $row['column']); 
    } 

    /* if this row isn't in $rows yet, add it */ 
    if (!in_array($row['row'], $rows)) { 
    array_push($rows, $row['row']); 
    } 

    /* set the actual value in our multi-dimensional array $data */ 
    $data[$row['row']][$row['column']] = $row['value']; 
} 
/* free the result (php specific thing) */ 
mysql_free_result($result); 

/* if we didn't set anything (row, column) pairs, set it to null in $data */ 
foreach ($rows as $r) { 
    foreach ($columns as $c) { 
    if (!array_key_exists($c, $data[$r])) { 
     $data[$r][$c] = null; 
    } 
    } 
} 

यह सभी डेटा को उस प्रारूप में रखेगा जो आप PHP में किसी सरणी में चाहते हैं।


उदाहरण के लिए, नमूना डेटा आप ऊपर दी गई पर इस एल्गोरिथ्म चलाने के बाद, आप करने में सक्षम हो जाएगा:

echo $data['2']['age']; // $data['row']['column'] 

कौन सा होगा उत्पादन 55.


या अगर आपका डेटाबेस वास्तविक समय में अपडेट नहीं किया जा रहा है (आपके पास डेटा का एक गुच्छा है जिसे आप लगातार एक बार फिर से सुधारना चाहते हैं), आप उपरोक्त स्क्रिप्ट का विस्तार कर सकते हैं ताकि कुछ "टेबल बनाएं", "INSERT INTO" प्रश्न था टी मूल रूप से उस प्रारूप में तालिका को फिर से बनाएं जिसे आप ढूंढ रहे हैं।

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

2

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

कारण आप यह नहीं कर सकते कि PostgreSQL की आवश्यकता है कि ट्यूपल संरचना को पहले से परिभाषित किया जाए। सभी डीबी ऐसा नहीं करते हैं (उदाहरण के लिए सूचना, विभिन्न पंक्तियों को विभिन्न संरचनाओं की अनुमति देता है!) लेकिन अधिकांश करते हैं।

हमारा दृष्टिकोण केवल PostgreSQL-only है। हालांकि, शायद कुछ tweaking के साथ आप कहीं भी एक MySQL समकक्ष पा सकते हैं।क्या हमने किया मूल रूप से अपने संस्करण में होगा:

1 {"age=3","height=55",null,"siblings=4"} 
2 {"age=55","height=54","favorite_number=12"} 

तुम भी द्वारा NULLS से छुटकारा पा सकते:

select row, array_agg("column" || '=' || "value") 
WHERE value is not null 
GROUP BY row; 

तो फिर तुम कुछ पाने

select row, array_agg("column" || '=' || "value") from sample_data group by row; 

इस तरह उत्पादन का उत्पादन जैसे:

1 {"age=3","height=55","siblings=4"} 
2 {"age=55","height=54","favorite_number=12"} 

मुझे नहीं पता कि MySQL में ऐसा कैसे करें।

संबंधित मुद्दे