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

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

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. mysql - תנאי לשדה סיכום

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

מתוזמן נעוץ נעול הועבר תכנות
3 פוסטים 3 כותבים 121 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • 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
        • דף הבית
        • קטגוריות
        • פוסטים אחרונים
        • משתמשים
        • חיפוש
        • חוקי הפורום