2010-08-31 8 views
11

मैं SQL में नया हूं। मैं उदाहरण के लिए, अलग-अलग परीक्षा के लिए डेटा के साथ एक डेटाबेस है:एसक्यूएल - विभिन्न श्रेणियों के लिए कॉलम

Student T1 T2 T3 
---------------------- 
St1  A B A 
St2  B B C 
St3  B A B 

मैं:

Student Test Grade 
-------------------- 
St1 T1 A 
St2 T1 B 
St3 T1 B 
St1 T2 B 
St2 T2 B 
St3 T2 A 
St1 T3 A 
St2 T3 C 
St3 T3 B 

फिर, मैं एक रिपोर्ट स्तंभों के रूप में टेस्ट (T1, T2 और T3) का उपयोग कर मुद्रित करने के लिए चाहते हैं विभिन्न चीजों की कोशिश की है, लेकिन मैं इस तरह के एक प्रिंटआउट का उत्पादन करने पर अटक गया। किसी भी मदद की सराहना की है!

+1

"कोड" बटन के साथ स्वरूपण आपको एक निश्चित चौड़ाई फ़ॉन्ट का उपयोग करने देगा, इन तालिकाओं को लाइन करने में मदद करेगा और अधिक पठनीय – ford

उत्तर

10

उपयोग:

SELECT t.student, 
     MAX(CASE WHEN t.test = 'T1' THEN t.grade END) AS T1, 
     MAX(CASE WHEN t.test = 'T2' THEN t.grade END) AS T2, 
     MAX(CASE WHEN t.test = 'T3' THEN t.grade END) AS T3 
    FROM TABLE t 
GROUP BY t.student 
+0

हाय, आप बहुत अच्छे हैं! आपको बहुत - बहुत धन्यवाद! यह पूरी तरह से काम किया! चीयर्स! -माइक –

+1

@ माइक सैंटोस: आपका स्वागत है, और एसओ में आपका स्वागत है। –

1

मैं एक ऐसी ही question एक समय पहले पूछा। आपको पिवट टेबल की तरह कुछ चाहिए, लेकिन, यह SQLite में उपलब्ध नहीं है (जहां तक ​​मुझे पता है)।

+0

जानकारी के लिए धन्यवाद! मैंने आपका प्रश्न देखा। –

1

मुझे विश्वास है कि यदि आप अधिक जानकारी तो शामिल करने के लिए इस प्रणाली का विस्तार करने जा रहे हैं, तो आप अपने डेटाबेस दोबारा काम से फायदा हो सकता है, मैं इसे इतना तरह का निर्माण होगा:

तालिका नाम = बोल्ड

स्तंभ का नाम = इटैलिक

छात्रों:

  • सिड (प्राथमिक कुंजी)
  • छात्र के बारे में अन्य जानकारी

टेस्ट:

  • टीआईडी ​​ (प्राथमिक कुंजी)
  • परीक्षण
  • बारे में अन्य जानकारी

टेस्ट ग्रेड

  • GID (प्राथमिक कुंजी)
  • टीआईडी ​​ (विदेशी कुंजी)
  • सिड (विदेशी कुंजी)
  • ग्रेड

यह संरचना डेटाबेस सामान्यीकृत नामक एक विचार पर आधारित है (यदि आप इसे Google करते हैं तो आपको बहुत सारी जानकारी मिल जाएगी)।मैं आप नीचे दिए गए एक आंशिक सारांश दे देंगे, लेकिन आप इसे पर पढ़ना चाहिए आप एसक्यूएल के बहुत सारे करने के लिए जा रहे हैं अपने आप को:

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

उदा छात्र के पास एसआईडी 1 है और उसके सभी परीक्षणों में एसआईडी कॉलम में 1 है। छात्र 2, 3, 4, और इसी तरह के लिए भी।

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

इन तालिकाओं मैं इस प्रयोग करेंगे से तुम क्या चाहते प्राप्त करने के लिए (अपने PHP में लिखा):

$sql = 'SELECT * FROM Tests ORDER BY TID'; 
$tempresult = mysql_query($sql); 
while($temprow = mysql_fetch_array($tempresult)){ 
    echo $temprow['TID']; 
} 

$sql = 'SELECT * FROM Students'; 
$result = mysql_query($sql); 
while($row = mysql_fetch_array($result)){ 
    echo '\n'.$row['SID']; 
    $sql = 'SELECT * FROM Grades WHERE SID='.$row['SID'].' ORDER BY TID'; 
    $result2 = mysql_query($sql); 
    while($row2 = mysql_fetch_array($result2)){ 
     echo ' '.$rows['Grade']; 
    } 
} 

आप गूंज बयान में इस पर फ़ॉर्मेटिंग जोड़ने के लिए और भी अतिरिक्त जानकारी आप चुनते के किसी भी मुद्रित कर सकते हैं जोड़ने के लिए। यदि आप कोई प्रश्न पूछते हैं तो कृपया उनसे पूछें।

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

+0

विस्तृत जानकारी के लिए बहुत बहुत धन्यवाद! मैं वास्तव में उसकी सराहना करता हूँ! धन्यवाद! -माइक –

0

प्रयास करें यह

SELECT Student, MAX(CASE WHEN Test = 'T1' THEN Grade END) AS T1, 
    MAX(CASE WHEN Test = 'T2' THEN Grade END) AS T2, 
    MAX(CASE WHEN Test = 'T3' THEN Grade END) AS T3 FROM tablename GROUP BY Student 

बजाय "tablename" की अपनी तालिका नाम का प्रयोग करें।

1

ऐसा करने के कुछ तरीके हैं, जिनमें से दोनों (शुद्ध एसक्यूएल में और एसक्यूएल कमांड उत्पन्न करने वाले कोड में) कॉलम की संख्या ज्ञात और तय की आवश्यकता होती है। सबसे लागू करने के लिए सरल होगा:

SELECT eg.Student, 
(SELECT Grade from ExamGrade eg1 WHERE eg1.Student = eg.Student AND Test = 'T1') AS T1 
(SELECT Grade from ExamGrade eg2 WHERE eg2.Student = eg.Student AND Test = 'T2') AS T2 
(SELECT Grade from ExamGrade eg3 WHERE eg3.Student = eg.Student AND Test = 'T3') AS T3 
FROM ExamGrade eg 

यह SQLite सहित व्यावहारिक किसी भी वातावरण में काम करेंगे, और यह थोड़ा एक अदिश-मान समारोह GetTest() है कि छात्र और परीक्षण ले जाएगा के साथ और अधिक सुरुचिपूर्ण बनाया जा सकता है संख्या और ग्रेड वापस। हालांकि, किसी भी मामले में, यह न तो कलाकार है और न ही बदलने के लिए बंद है; यह एन परीक्षणों के लिए एन-स्क्वायर टाइम्स तालिका से पूछताछ करेगा, और यदि आप चौथा परीक्षण जोड़ते हैं, तो इस क्वेरी को रिपोर्ट में शामिल करने के लिए इसे बदलना होगा।

यदि छात्र और टेस्ट का संयोजन अद्वितीय है, और आप पिवोट कार्यक्षमता (जो स्पष्ट रूप से SQLite नहीं है) के साथ डेटाबेस में काम कर रहे हैं, तो आप किसी भी एग्रीगेटर के साथ एक पिवट क्वेरी का उपयोग कर सकते हैं (MAX/एक मान के साथ सेट के MIN/AVG/SUM वह मान है)। एमएसएस2005 में निम्नलिखित कार्य:

SELECT Student, T1, T2, T3 
FROM (Select Student, Test, Grade FROM ExamGrade) As SourceQuery 
PIVOT (MAX(Grade) FOR Test IN (T1, T2, T3)) AS PivotTable 

यह अधिक प्रदर्शनकारी होगा, और यह कहीं अधिक सुरुचिपूर्ण होगा। स्तंभ सूचियाँ अभी भी गतिशील AFAIK निर्धारित नहीं किया जा सकता है, लेकिन वे उत्पन्न करने के लिए आप आवेदन कोड से इस क्वेरी कर रहे हैं, या sp_executesql का उपयोग करना है, तो तुच्छ हो निर्मित एमएस एसक्यूएल सर्वर में संग्रहीत proc एक और संग्रहीत proc से एक प्रश्न उत्पन्न करने के लिए या समारोह।

+0

जानकारी के लिए बहुत बहुत धन्यवाद! –

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