• דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

mysql - תנאי לשדה סיכום

מתוזמן נעוץ נעול הועבר תכנות
3 פוסטים 3 כותבים 97 צפיות
    • מהישן לחדש
    • מהחדש לישן
    • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • shpro654S מנותק
    shpro654S מנותק
    shpro654
    כתב ב נערך לאחרונה על ידי
    #1

    יש לי:
    טבלת קבוצות
    טבלת לקוחות
    (קבוצה, לקוח)
    טבלת רכישות ללקוח (לקוח, סכום)

    ישנם לקוחות ללא רכישות

    רוצה לסכם: לכל קבוצה, לכמה אחוזים מהלקוחות יש רכישות, ולכמה לא.
    אך בתנאי שהרכישה מעל 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";
    
    א תגובה 1 תגובה אחרונה
    0
  • א מנותק
    א מנותק
    ארכיטקט
    השיב לshpro654 ב נערך לאחרונה על ידי
    #2

    @shpro654
    אענה לך בלי קוד: אתה צריך להשתמש בתת שאילתה בכדי לקבל תוצאה כרצונך
    האם MySql הוא כל כך אלוף בעיבוד תתי שאילתות כמו אויבו המר SQL SERVER? אין לי תשובה והרבה פעמים נתקלתי בביצועים גרועים מאוד.
    כמו"כ השאילתה שלך עושה ג'וינים של רבים ליחיד וזה ישכפל לך את כל הרשומות (ואז צריך לעשות Distinct כדי לתקן את זה, זה בערך כמו לתת למישהו כדור נגד דיכאון ואז כדור נוסף בעד דיכאון כדי שהוא לא ייצא משליטה מרוב שמחה וכו', לא עובדים ככה פשוט לא נכנסים לדיכאון וזהו).

    אם תרצה תשובה עם קוד יש באינטרנט פידלים רבים ל MYSQL הנה אחד לדוגמא: https://www.db-fiddle.com/
    אם תואיל בטובך ליצור לנו שם טיפלה טבלאות כדי שיהיה כיף לעבוד ולראות את התוצאה אשמח לעזור לך גם עם קוד.
    כמו"כ אם אין לך כוח לפידלים אני תמיד עוזר בחינם לאנשים בתנאי שהם לא רשעים (ואני רשאי לקבוע מי רשע ומי לא) אז פנה אלי בפרטי.

    אידיאולוגיות גדולות נכנסות למטחנה של עולם המעשה ויוצאות ממנו בפירורים (ווינסטון צ'רצ'יל, סתם סתם, זה שלי)

    תגובה 1 תגובה אחרונה
    2
  • OdedDvirO מנותק
    OdedDvirO מנותק
    OdedDvir
    כתב ב נערך לאחרונה על ידי OdedDvir
    #3

    @shpro654 חילקתי את הבעיה ל-3 בעיות יותר קלות, וכתבתי לכל אחת שאילתא נפרדת.

    1. רשימת הרכישות הרצויות מעל 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));
    
    1. ואז על ידיה אפשר לקבל את מספר הרכישות הרצויות בכל קבוצה:
    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;
    
    1. מספר הלקוחות הכולל בכל קבוצה:
    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;
    
    תגובה 1 תגובה אחרונה
    2

  • התחברות

  • אין לך חשבון עדיין? הרשמה

  • התחברו או הירשמו כדי לחפש.
  • פוסט ראשון
    פוסט אחרון
0
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
  • התחברות

  • אין לך חשבון עדיין? הרשמה

  • התחברו או הירשמו כדי לחפש.