आप इस समस्या को शुद्ध SQL में हल कर सकते हैं, इसके लिए आपको किसी फ़ंक्शन की आवश्यकता नहीं है।
सबसे अच्छी बात यह है कि आँकड़ों के संग्रह को दो अलग-अलग प्रश्नों में विभाजित किया जाता है, एक जब टीम घर पर खेलती है, एक जब वे खेलते हैं। प्रत्येक खेल के लिए अंक और बनाए गए लक्ष्यों की गणना करें। फिर UNION
उन दो प्रश्नों और समग्र आँकड़ों की गणना के लिए एक उप-क्वेरी के रूप में उपयोग करें:
SELECT
eq.nom_equipo AS equipo,
COUNT(p.*) AS partidos_jug,
SUM(CASE WHEN p.puntos = 3 THEN 1 ELSE 0 END) partidos_gana,
SUM(CASE WHEN p.puntos = 1 THEN 1 ELSE 0 END) partidos_emp,
SUM(CASE WHEN p.puntos = 0 THEN 1 ELSE 0 END) partidos_perd,
SUM(p.puntos) AS puntos,
SUM(p.goles) AS goles_favor
FROM equipos eq
JOIN (
-- Playing at home
SELECT
num_eqpo_loc AS eqpo,
CASE WHEN (goles_loc > goles_vis) THEN 3
WHEN (goles_loc = goles_vis) THEN 1
ELSE 0
END AS puntos,
goles_loc AS goles
FROM partidos
UNION
-- Playing away
SELECT
num_eqpo_vis AS eqpo,
CASE WHEN (goles_vis > goles_loc) THEN 3
WHEN (goles_vis = goles_loc) THEN 1
ELSE 0
END AS puntos,
goles_vis AS goles
FROM partidos) AS p ON p.eqpo = eq.num_eqpo
GROUP BY equipo
ORDER BY puntos DESC, partidos_jug ASC, goles_favor DESC;
CASE
. के कारण यह विशेष रूप से तेज़ नहीं है बयान, लेकिन यह एक प्रक्रिया और एक लूप का उपयोग करने की तुलना में तेज़ होगा।
इस क्वेरी के परिणाम को एक तालिका में रखने के बजाय, मैं सुझाव दूंगा कि आप CREATE VIEW general AS ...
उपरोक्त क्वेरी के साथ। उस स्थिति में आप हमेशा नवीनतम परिणाम प्राप्त करते हैं जब आप SELECT * FROM general
और आपको TRUNCATE
. करने की ज़रूरत नहीं है क्वेरी चलाने से पहले सामान्य तालिका (तालिका में डेटा के साथ नए परिणाम जोड़ने से पीके बाधा का उल्लंघन होगा)। यदि आपको वास्तव में तालिका की आवश्यकता है तो SELECT ... INTO general FROM ...
. का उपयोग करें उपरोक्त क्वेरी में।