mysql - תנאי לשדה סיכום
-
יש לי:
טבלת קבוצות
טבלת לקוחות
(קבוצה, לקוח)
טבלת רכישות ללקוח (לקוח, סכום)ישנם לקוחות ללא רכישות
רוצה לסכם: לכל קבוצה, לכמה אחוזים מהלקוחות יש רכישות, ולכמה לא.
אך בתנאי שהרכישה מעל 50 ש"ח.הבעיה היא שלא יכול לעשות תנאי על טבלת הרכישות,
כי אז יביא רק לקוחות עם רכישות.
פתרונות?בלי התנאי של +50 ש"ח, השאילתא היא:
SELECT groups.group AS group_name, IF(COUNT(shopping.id)<1, 0, round(( COUNT(shopping.id)/COUNT(customers.id) * 100 ),0)) AS percent FROM groups LEFT JOIN customers ON groups.id= customers.group LEFT JOIN shopping ON customers.id = shopping.customer GROUP BY groups.id";
-
@shpro654
אענה לך בלי קוד: אתה צריך להשתמש בתת שאילתה בכדי לקבל תוצאה כרצונך
האם MySql הוא כל כך אלוף בעיבוד תתי שאילתות כמו אויבו המר SQL SERVER? אין לי תשובה והרבה פעמים נתקלתי בביצועים גרועים מאוד.
כמו"כ השאילתה שלך עושה ג'וינים של רבים ליחיד וזה ישכפל לך את כל הרשומות (ואז צריך לעשות Distinct כדי לתקן את זה, זה בערך כמו לתת למישהו כדור נגד דיכאון ואז כדור נוסף בעד דיכאון כדי שהוא לא ייצא משליטה מרוב שמחה וכו', לא עובדים ככה פשוט לא נכנסים לדיכאון וזהו).אם תרצה תשובה עם קוד יש באינטרנט פידלים רבים ל MYSQL הנה אחד לדוגמא: https://www.db-fiddle.com/
אם תואיל בטובך ליצור לנו שם טיפלה טבלאות כדי שיהיה כיף לעבוד ולראות את התוצאה אשמח לעזור לך גם עם קוד.
כמו"כ אם אין לך כוח לפידלים אני תמיד עוזר בחינם לאנשים בתנאי שהם לא רשעים (ואני רשאי לקבוע מי רשע ומי לא) אז פנה אלי בפרטי. -
@shpro654 חילקתי את הבעיה ל-3 בעיות יותר קלות, וכתבתי לכל אחת שאילתא נפרדת.
- רשימת הרכישות הרצויות מעל 50 ש"ח:
SELECT customers.group_id, shopping.customer_id, Sum(IIf([purchase_amount]>50,1,0)) AS valid_puchase_count FROM customers INNER JOIN shopping ON customers.id = shopping.customer_id GROUP BY customers.group_id, shopping.customer_id HAVING (((Sum(IIf([purchase_amount]>50,1,0)))>0));
- ואז על ידיה אפשר לקבל את מספר הרכישות הרצויות בכל קבוצה:
SELECT valid_puchases.group_id, Count(valid_puchases.customer_id) AS customers_with_valid_purchases FROM ( SELECT customers.group_id, shopping.customer_id, Sum(IIf([purchase_amount]>50,1,0)) AS valid_puchase_count FROM customers INNER JOIN shopping ON customers.id = shopping.customer_id GROUP BY customers.group_id, shopping.customer_id HAVING (((Sum(IIf([purchase_amount]>50,1,0)))>0))) AS valid_puchases GROUP BY valid_puchases.group_id;
- מספר הלקוחות הכולל בכל קבוצה:
SELECT groups.group_name, groups.id, Count(customers.id) AS customers_in_group FROM groups LEFT JOIN customers ON groups.id = customers.group_id GROUP BY groups.group_name, groups.id;
ולבסוף איגדתי את כולן לשאילתא אחת:
SELECT AllCustomers.group_name, AllCustomers.id, AllCustomers.customers_in_group, CustomersWithPurchase.customers_with_valid_purchases, IFNULL(CustomersWithPurchase.customers_with_valid_purchases,0)/(AllCustomers.customers_in_group) AS Per FROM ( SELECT groups.group_name, groups.id, Count(customers.id) AS customers_in_group FROM groups LEFT JOIN customers ON groups.id = customers.group_id GROUP BY groups.group_name, groups.id) AS AllCustomers LEFT JOIN ( SELECT valid_puchases.group_id, Count(valid_puchases.customer_id) AS customers_with_valid_purchases FROM ( SELECT customers.group_id, shopping.customer_id, Sum(IIf([purchase_amount]>50,1,0)) AS valid_puchase_count FROM customers INNER JOIN shopping ON customers.id = shopping.customer_id GROUP BY customers.group_id, shopping.customer_id HAVING (((Sum(IIf([purchase_amount]>50,1,0)))>0))) AS valid_puchases GROUP BY valid_puchases.group_id) AS CustomersWithPurchase ON AllCustomers.id = CustomersWithPurchase.group_id;