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

लेकिन जब मैं% अंतर की गणना करने की कोशिश करता हूं (जैसा कि आप नीचे मेरे कोड से देख सकते हैं), मुझे नहीं पता कि कोड में 'औसत पॉप 2000' और 'औसत पॉप 2010' कॉलम का संदर्भ कैसे दिया जाए क्योंकि वे नहीं हैं एक वेरिएबल असाइन किया गया जिसे मैं संदर्भित कर सकता हूं। कोड में, मैंने इन कॉलमों को संदर्भित करने के लिए avg_pop_2010 और avg_pop_2000 का उपयोग किया है - जाहिर है यह वास्तव में काम नहीं करता है।

WITH avg_pop AS( SELECT countries.continent, 
ROUND(AVG(CASE WHEN population_years.year = 2000 THEN population_years.population END), 2) as 'avg pop 2000',
ROUND(AVG(CASE WHEN population_years.year = 2010 THEN population_years.population END), 2) as 'avg pop 2010'
FROM countries 
JOIN population_years 
WHERE population_years.country_id = countries.id
GROUP BY 1)

SELECT countries.continent, ROUND(((avg_pop_2010 - avg_pop_2000)/avg_pop_2000)*100.0, 2) AS '%diff'
FROM avg_pop;
0
user7483931 16 सितंबर 2020, 22:38

2 जवाब

सबसे बढ़िया उत्तर

एक अन्य विकल्प भावों को दोहराना है - थोड़ा अनुकूलन के साथ:

select
    c.continent,
    round(avg(case when py.year = 2000 then py.population end), 2) avg_pop_2000,
    round(avg(case when py.year = 2010 then py.population end), 2) avg_pop_2010,
    round(
        100.* avg(case when py.year = 2010 then py.population else - py.population end)
        / avg(case when py.year = 2000 then py.population end),
        2
    ) percent_diff
from countries c
inner join population_years py on py.country_id = c.id
where py.year in (2010, 2020)
group by c.continent

साइड नोट्स:

  • पहचानकर्ताओं के लिए सिंगल कोट्स का उपयोग न करें! वे मानक एसक्यूएल में शाब्दिक तार के लिए खड़े हैं; सामान्य तौर पर, आपको ऐसे पहचानकर्ताओं को प्राथमिकता देनी चाहिए जिन्हें उद्धृत करने की आवश्यकता नहीं है। यदि उद्धरण की आवश्यकता है, तो मानक दोहरे उद्धरण चिह्नों (") का उपयोग करें, जिसे SQLite पहचानता है

  • प्रासंगिक वर्षों को where क्लॉज के साथ प्रीफ़िल्टर करना क्वेरी को अधिक कुशल बनाता है

  • मानक शामिल सिंटैक्स का उपयोग करें; शामिल होने की शर्त on में शामिल होने के खंड में जाती है, न कि where खंड में

  • गोलाई, तो प्रतिशत अंतर की गणना सटीक नहीं है; पहले गणना करें, फिर गोल करें

  • तालिका उपनाम क्वेरी को लिखने और पढ़ने में आसान बनाते हैं

0
GMB 16 सितंबर 2020, 22:55
    WITH avg_pop AS( SELECT countries.continent, 
    ROUND(AVG(CASE WHEN population_years.year = 2000 THEN population_years.population END), 2) as avg_pop_2000,
    ROUND(AVG(CASE WHEN population_years.year = 2010 THEN population_years.population END), 2) as avg_pop_2010
    FROM countries 
    JOIN population_years 
    WHERE population_years.country_id = countries.id
    GROUP BY 1)

    SELECT continent, ROUND((( avg_pop_2000 - avg_pop_2010)/avg_pop_2010)*100, 2) AS '%diff'
    FROM avg_pop;

यहाँ एक छोटा डेमो है:

डेमो

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

0
VBoka 16 सितंबर 2020, 23:01