Nested Aggregate functions in mysql - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

Nested Aggregate functions in mysql


jackofalltrades

Recommended Posts


-- (Q3) Find Insurance Company with the maximal number of members (patients).

SELECT Temp.Company, Temp.ID, Temp.Amount
FROM (SELECT I.name AS Company, I.cid AS ID, COUNT(P.pid) AS Amount
FROM Insurance_Company I, Patients P
WHERE P.cid = I.cid
GROUP BY ID
) AS Temp
WHERE Temp.Amount = (SELECT MAX (Temp.Amount)
FROM Temp)

אני לומד מהמצגות של רמקרישנן וכך מתארים את האגרגציה המקוננת, אבל כשאני רוצה להריץ את זה במיי-אסקיואל הוא אומר:

( Error Code: 1146. Table 'medical_service.temp' doesn't exist

אבל זה כן עובד כשאני מחליף את המילה Temp ב-From השני לכל הבלוק From הגדול. :kopfpatsch: יש דרך לעשות את זה כמו שאני תכננתי?

קישור לתוכן
שתף באתרים אחרים

  • 2 שבועות מאוחר יותר...

תנסה להעיף את הas, לא סגור על הסינטקס של mysql, אבל בימינו לא צריך לסמן כל alias עם as.

חוץ מזה שselect המקונן בwhere הוא רעיון רע מבחינת ביצועים.

קישור לתוכן
שתף באתרים אחרים

  • 2 שבועות מאוחר יותר...


SELECT Temp.Company, Temp.ID, Temp.Amount
FROM (SELECT I.name AS Company, I.cid AS ID, COUNT(P.pid) AS Amount
FROM Insurance_Company I, Patients P
WHERE P.cid = I.cid
GROUP BY ID) AS Temp
WHERE Temp.Amount = (SELECT MAX (Temp.Amount)
FROM Temp)

שתי בעיות- ID לא קיים (ה select נעשה אחרי הgroup by), ואתה לא יכול להציג נתון בgroup by מבלי שהוא יהיה כחלק מהgroup by/ בעל פונקציה אנליטית.


SELECT Temp.Company, Temp.ID, Temp.Amount
FROM (
SELECT I.name AS Company, I.cid AS ID, COUNT(P.pid) AS Amount
FROM Insurance_Company I, Patients P
WHERE P.cid = I.cid
GROUP BY P.cid, I.name
) AS Temp
WHERE Temp.Amount = (SELECT MAX (Temp.Amount)
FROM Temp)

ואנחנו עדיין לא שם, אם נלך בגישתך אז עדיף:


with temp as(
SELECT I.name AS Company, I.cid AS ID, COUNT(P.pid) AS Amount
FROM Insurance_Company I, Patients P
WHERE P.cid = I.cid
GROUP BY P.cid, I.name
)
SELECT Temp.Company, Temp.ID, Temp.Amount
FROM temp
WHERE Temp.Amount = (SELECT MAX (Temp.Amount)
FROM Temp)

ובכלל אם כבר עדיף:


SELECT I.name Company, I.cid ID, COUNT(P.pid) Amount
FROM Insurance_Company I Join Patients P using(cid)
GROUP BY cid, I.name having max(count(*))=count(*)

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...