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

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

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

מסד נתונים כטבלא בשני ממדים

מתוזמן נעוץ נעול הועבר תכנות
17 פוסטים 7 כותבים 366 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • OdedDvirO מנותק
    OdedDvirO מנותק
    OdedDvir
    כתב ב נערך לאחרונה על ידי
    #4

    התחביר הנכון הוא כך:

    SELECT monthYear,
           SUM(CASE WHEN name = 'REOUVEN' THEN price END) AS REOUVEN,
           SUM(CASE WHEN name = 'SHIMON' THEN price END) AS SHIMON,
           SUM(CASE WHEN name = 'LEVI' THEN price END) AS LEVI    
    FROM AZMANOT
    GROUP BY monthYear
    ORDER BY monthYear DESC;
    
    שואףש dovidD 2 תגובות תגובה אחרונה
    7
    • שואףש מנותק
      שואףש מנותק
      שואף
      השיב לOdedDvir ב נערך לאחרונה על ידי
      #5

      @OdedDvir יישר כוח. לא ידעתי שיש חילוק בין IF וCASE.
      העברתי לMYSQL 8 וזה גם עובד נהדר, כנראה שיש הבדל מהותי יותר עם CASE שתופס על GROUP.
      https://www.db-fiddle.com/f/75xSbAmhsC5wbDhfxTDxcR/1

      עכשיו לשאלה השניה.
      מה הצורה הנכונה להכין שאילתא אוטומטית, שגם אם יהיו עשר לקוחות, זה יכין את הטבלא הזו בצורה נכונה.
      תודה רבה!

      ליצירת קשר: admin@i-call.me

      הידד! גישה למייל גם בלי מחשב ואינטרנט!

      OdedDvirO תגובה 1 תגובה אחרונה
      0
      • dovidD מנותק
        dovidD מנותק
        dovid ניהול
        השיב לOdedDvir ב נערך לאחרונה על ידי dovid
        #6

        הנה דוגמה מצויינת למה היכולת של MYSQL להשמיט פונקציית צבירה בפירוש מביא לבאגים (https://tchumim.com/topic/13246, ואם להיות ספציפי למי שנראה לי מעניין אותו זה @יוסף-בן-שמעון).
        @שואף, התיקון לבעיה שלך איננו ההבדל בין IF לבין CASE (אין לי מושג למה @OdedDvir על הדרך שיפר את זה עבור MSSQL).
        הנקודה היא שלא עטפת את הIF בSUM.
        ובשביל להבין מה הבעיה צריך פשוט להוריד את הGROUP BY ואז הבעיה בולטת לעיניים:
        יש לנו שורה לכל קניה, ובשורה הראשונה הקניה היא של REUVEN ולכן הסכום שמה בREUVEN יהיה סכום הקניה, אולם העמודות של שמעון ולוי יהיו 1. מה קורה בעת הקיבוץ? כל שלושת השורות של חודש מסויים הופכים לשורה אחת. ואיזה ערך יופיע בכל אחד מהעמודות? אז איפה שצויין SUM, יופיע סיכום. איפה שלא, יילקח הערך של השורה הראשונה של הקבוצה... קרי השורה של REUVEN.

        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

        בכל נושא אפשר ליצור קשר dovid@tchumim.com

        OdedDvirO תגובה 1 תגובה אחרונה
        6
        • OdedDvirO מנותק
          OdedDvirO מנותק
          OdedDvir
          השיב לשואף ב נערך לאחרונה על ידי
          #7

          @שואף אתה בעצם מבקש ליצור טבלת ציר. לא ידוע לי שיש פונקציית PIVOT ב-MySQL, לכן צריך להתחכם ולשרשר כמה משפטי CASE ברצף.
          כדי לקבל את שם העמודה בכל פעם, יש ליצור את נוסח המשפט באופן דינמי עבור כל ערך, ואז להשתמש ב GROUP_CONCAT:

          SET @sql = NULL;
          SELECT
          GROUP_CONCAT(DISTINCT CONCAT(
            'SUM(CASE WHEN name = "', name, '" THEN price ELSE 0 END)  AS ', name)
          )
          INTO @sql
          FROM AZMANOT;
           
          SET @sql = CONCAT('SELECT monthYear, ', @sql, ' FROM AZMANOT GROUP BY monthYear');
          
          SELECT @sql;
           
          PREPARE t FROM @sql;
          EXECUTE t;
          DEALLOCATE PREPARE t;
          
          תגובה 1 תגובה אחרונה
          5
          • OdedDvirO מנותק
            OdedDvirO מנותק
            OdedDvir
            השיב לdovid ב נערך לאחרונה על ידי
            #8

            @dovid אמר במסד נתונים כטבלא בשני ממדים:

            אין לי מושג למה @OdedDvir על הדרך שיפר את זה עבור MSSQL

            צודק, בראש הקודח שלי תקוע ש-CASE עדיף מ-IF, (אאל"ט בגלל שהוא תומך ב Short-Circuting), אבל כאן זה לכאורה לא משנה, ואפשר לכתוב גם כך:

            SUM(IF(name = 'REOUVEN', price, 0)) AS REOUVEN,
            ...
            
            תגובה 1 תגובה אחרונה
            3
            • שואףש מנותק
              שואףש מנותק
              שואף
              כתב ב נערך לאחרונה על ידי
              #9

              @OdedDvir תודה רבה מאוד! ישבתי ללמוד את השאילתא שלך, יש בה כמה אלמנטים שלא הכרתי.
              תרשה לי לשאול כמה שאלות.
              א. למה השורה הראשונה? ענין של תקינות?

              SET @sql = NULL;
              

              ב. למה כתבת בשורה הרביעית ELSE 0 ? מה היה חסר בלי זה?

              ג. שורה 11 כתבת SELECT @sql; כנ"ל זה היה נחוץ, או רק בשביל הדיבגינג?

              שוב תודה.

              ליצירת קשר: admin@i-call.me

              הידד! גישה למייל גם בלי מחשב ואינטרנט!

              OdedDvirO dovidD 2 תגובות תגובה אחרונה
              1
              • OdedDvirO מנותק
                OdedDvirO מנותק
                OdedDvir
                השיב לשואף ב נערך לאחרונה על ידי OdedDvir
                #10

                @שואף הכל לא מעכב בכלל.
                א. הרגל (מגונה?) אני לא סומך על ערך ברירת מחדל.
                ב. פשוט הרגל, אחרת CASE מחזירה NULL. אכן זה לא בעיה בפונקציה של SUM, אבל ב-COUNT השורה לא תיכלל בספירה אם הערך NULL, זה לא תמיד רצוי.
                ג. מיותר.

                תגובה 1 תגובה אחרונה
                1
                • dovidD מנותק
                  dovidD מנותק
                  dovid ניהול
                  השיב לשואף ב נערך לאחרונה על ידי dovid
                  #11

                  @שואף רק כדי לאזן את הרושם שנותן הראש הקודח (במובן החיובי) פה בפורום,
                  למעט סעיף ג' (הSELECT) הכל נחוץ!
                  אומר לך שזה כמו שמישהו יוצא מהחנות עם מוצרים בתוך שקית ומישהו שואל אותו למה הוא לקח שקית והוא עונה שזה באמת מיותר...

                  מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                  בכל נושא אפשר ליצור קשר dovid@tchumim.com

                  שואףש תגובה 1 תגובה אחרונה
                  4
                  • שואףש מנותק
                    שואףש מנותק
                    שואף
                    השיב לdovid ב נערך לאחרונה על ידי
                    #12

                    @dovid אמר במסד נתונים כטבלא בשני ממדים:

                    הכל נחוץ!

                    היית כותב "מומלץ". תסביר למה נחוץ?
                    ובמשל על השקית, אם הוא קונה בורג, שהוא יכול לשים בכיס, באמת מיותר לקחת שקית.

                    ליצירת קשר: admin@i-call.me

                    הידד! גישה למייל גם בלי מחשב ואינטרנט!

                    OdedDvirO תגובה 1 תגובה אחרונה
                    1
                    • OdedDvirO מנותק
                      OdedDvirO מנותק
                      OdedDvir
                      השיב לשואף ב נערך לאחרונה על ידי
                      #13

                      @שואף למרות שהקוד לכאורה יעבוד גם בלי התוספות האלו, כתבתי שלענ"ד זה עניין של הרגלים טובים. הללו נועדו כדי למנוע בעיות בעתיד, כשכבר הספקת לשכוח פעמיים מה כתבת כאן בקוד, ואתה מוצא את עצמך מחפש בנרות את הבעיה.

                      זה הדברים הקטנים האלו בתכנות שעלולים לגרום בעיות גדולות בהמשך.
                      דוגמא משעשעת לכך היא הטעות שהשתרבבה לגוגל באחד העדכונים ל ChromeOS, וגרמה לאלפי משתמשים להנעל מחוץ לחשבון שלהם.
                      הטעות היתה בהשמטת תו אחד בודד בבדיקה של סיסמת המשתמש בתנאי if, בו בטעות השתמשו באופרטור הבינארי & במקום באופרטור הלוגי &&.
                      דהיינו כתבו:

                      if (key_data_.has_value() & !key_data_->label().empty()) {
                      

                      במקום

                      if (key_data_.has_value() && !key_data_->label().empty()) {
                      

                      מה שגרם להחזרה של ערך false גם במקרה של סיסמה נכונה, ולהציג למשתמש את ההודעה ש"אנו מצטערים, אבל לא הצלחנו לאמת את סיסמתך."

                      צדיק תמיםצ תגובה 1 תגובה אחרונה
                      7
                      • צדיק תמיםצ מנותק
                        צדיק תמיםצ מנותק
                        צדיק תמים
                        השיב לOdedDvir ב נערך לאחרונה על ידי
                        #14

                        @OdedDvir על זה נאמר: ככל שרמת החוּמרה של הבאג גבוהה יותר, כך הסיבה שגרמה לבאג מטופשת יותר...

                        Don’t comment bad code — rewrite it." — Brian W. Kernighan and P. J. Plaugher"
                        טיפים

                        תגובה 1 תגובה אחרונה
                        2
                        • אפר שריפהא מנותק
                          אפר שריפהא מנותק
                          אפר שריפה
                          השיב לשואף ב נערך לאחרונה על ידי
                          #15

                          @שואף נראה לי שזה הרבה יותר רלוונטי אליך
                          https://stackoverflow.com/questions/15931607/convert-rows-to-columns-using-pivot-in-sql-server

                          שואףש Y.Excel.AccessY 2 תגובות תגובה אחרונה
                          1
                          • שואףש מנותק
                            שואףש מנותק
                            שואף
                            השיב לאפר שריפה ב נערך לאחרונה על ידי
                            #16

                            @אפר-שריפה תודה. אבל זה לא מתייחס לMYSQL.

                            ליצירת קשר: admin@i-call.me

                            הידד! גישה למייל גם בלי מחשב ואינטרנט!

                            תגובה 1 תגובה אחרונה
                            1
                            • Y.Excel.AccessY מנותק
                              Y.Excel.AccessY מנותק
                              Y.Excel.Access
                              השיב לאפר שריפה ב נערך לאחרונה על ידי Y.Excel.Access
                              #17

                              @אפר-שריפה אמר במסד נתונים כטבלא בשני ממדים:

                              @שואף נראה לי שזה הרבה יותר רלוונטי אליך
                              https://stackoverflow.com/questions/15931607/convert-rows-to-columns-using-pivot-in-sql-server

                              אולי התכוונת לזה - https://stackoverflow.com/questions/7674786/how-can-i-return-pivot-table-output-in-mysql

                              יש שם כמה פתרונות...

                              Y.Excel.Access @ gmail.com

                              תגובה 1 תגובה אחרונה
                              1
                              • dovidD dovid העביר נושא זה מ-תכנות ב-

                              בא תתחבר לדף היומי!
                              • התחברות

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

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