2012-04-02 16 views
23

मैं एक मेज है कि कुछ इस तरह दिखता है के मूल्य के आधार का चुनाव कैसे करें:MySQL - एक और चयन

Name Year Value 
A  2000  5 
A  2001  3 
A  2002  7 
A  2003  1 
B  2000  6 
B  2001  1 
B  2002  8 
B  2003  2 

उपयोगकर्ता वर्षों की सीमा के आधार पर क्वेरी कर सकता है, और यह मूल्य की राशि वापस आ जाएगी नाम के आधार पर वर्गीकृत, जैसे (मान पूछे वर्ष 2000 कर रहे हैं - 2001):

Name SUM(Value) 
A   8 
B   7 

अब, मैं परिकलित क्षेत्र है कि करने के लिए सभी वर्षों के लिए एक नाम के मानों का योग के अनुपात आउटपुट सम्मिलित करना चाहता था सभी मूल्यों का योग। मूल रूप से ए और बी, के लिए जिम्मेदार ठहराया सभी मूल्यों का प्रतिशत क्रमश: जैसे:

Name SUM(Value) % Of Total 
A   8   0.484  (16/33) 
B   7   0.516  (17/33) 

ध्यान दें कि भले ही उपयोगकर्ता केवल 2000-2001 पूछे, मैं गणना सभी वर्षों भर में योग का उपयोग करना चाहते। मैं घंटों के लिए खोज और प्रयोग कर रहा हूं और मैं यह नहीं समझ सकता कि कैसे। मैं केवल पता तो जैसे पूछे साल भर में योग करने के लिए कैसे:

SELECT `Name`, SUM(`Value`)/(SELECT SUM(`Value`) FROM `table1`) AS "% of Total" 
FROM `table1` 
WHERE `Year` BETWEEN 2000 AND 2001 
GROUP BY `Name`; 

कृपया मदद! मैं बहुत नौसिखिया हूं, और एसक्यूएल को बहुत गहराई से समझ नहीं पा रहा हूं, इसलिए कृपया किसी भी उन्नत कोड को स्पष्ट करें। आपकी दयालुता के लिए धन्यवाद।

उत्तर

42

आप (और कहा कि वांछित प्रतिशत से) कुल की गणना कर सकते FROM खंड में एक सबक्वेरी का उपयोग करके:

SELECT Name, 
     SUM(Value) AS "SUM(VALUE)", 
     SUM(Value)/totals.total AS "% of Total" 
FROM table1, 
     (
      SELECT Name, 
        SUM(Value) AS total 
      FROM table1 
      GROUP BY Name 
     ) AS totals 
WHERE table1.Name = totals.Name 
AND Year BETWEEN 2000 AND 2001 
GROUP BY Name; 

ध्यान दें कि सबक्वायरी में WHERE क्लॉज वर्षों को फ़िल्टर नहीं करता है।

+0

के लिए सिर्फ एक उपनाम है जो एक आकर्षण की तरह समझने और काम करने के लिए सबसे आसान है। आपको बहुत - बहुत धन्यवाद! – John

3

यदि आप किसी अन्य SELECT के मूल्य के आधार SELECT चाहते हैं, तो आप शायद एक "सबसिलेक्ट" हैं: (ऊपर के लिंक से)

http://beginner-sql-tutorial.com/sql-subquery.htm

उदाहरण के लिए,:

  1. आप तालिका "student_details" से प्रथम और अंतिम नाम चाहते ...

  2. लेकिन आप केवल "विज्ञान" कक्षा में उन छात्रों के लिए इस जानकारी चाहते हैं:

    SELECT id, first_name 
    FROM student_details 
    WHERE first_name IN (SELECT first_name 
    FROM student_details 
    WHERE subject= 'Science'); 
    

सच कहूं, मुझे यकीन है कि यह आपके लिए है या नहीं जो खोज रहे हैं है नहीं कर रहा हूँ ... लेकिन मुझे आशा है कि यह मदद करता है ... कम से कम एक छोटे से ...

IMHO ...

+0

नमूना उपयोगी नहीं है, जब तक कि सबक्वायरी को कोई समझ नहीं आता है, तब तक – zerkms

+0

मेरे पास बहुत नीचे है, लेकिन मैं वाक्यविन्यास नहीं समझ सकता। मैं एक आंतरिक तालिका से एक मूल्य शामिल करने की कोशिश कर रहा हूं जो बाहरी तालिका से मूल्य पर निर्भर करता है। – John

+0

पुस्तक की सिफारिश: http://www.amazon.com/SQL-Queries-Mere-Mortals-Manipulation/dp/0321444434 व्यक्तिगत रूप से, मुझे यह बहुत उपयोगी पाया है। मैं ईमानदारी से सोचता हूं कि आप इसे भी पसंद कर सकते हैं। IMHO ... – paulsm4

2
SELECT x.name, x.summary, (x.summary/COUNT(*)) as percents_of_total 
FROM tbl t 
INNER JOIN 
(SELECT name, SUM(value) as summary 
FROM tbl 
WHERE year BETWEEN 2000 AND 2001 
GROUP BY name) x ON x.name = t.name 
GROUP BY x.name, x.summary 
+0

एक्स कहां से आ रहा है? – John

+0

@ जॉन: यह नेस्टेड क्वेरी – zerkms

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