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

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

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

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

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

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

      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;
      
      שואףש מנותק
      שואףש מנותק
      שואף
      כתב ב נערך לאחרונה על ידי
      #5

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

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

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

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

      OdedDvirO תגובה 1 תגובה אחרונה
      0
      • OdedDvirO OdedDvir

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

        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 מנותק
        dovidD מנותק
        dovid
        ניהול
        כתב ב נערך לאחרונה על ידי 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
        • שואףש שואף

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

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

          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
          • dovidD dovid

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

            OdedDvirO מנותק
            OdedDvirO מנותק
            OdedDvir
            כתב ב נערך לאחרונה על ידי
            #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
              • שואףש שואף

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

                SET @sql = NULL;
                

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

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

                שוב תודה.

                OdedDvirO מנותק
                OdedDvirO מנותק
                OdedDvir
                כתב ב נערך לאחרונה על ידי OdedDvir
                #10

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

                תגובה 1 תגובה אחרונה
                1
                • שואףש שואף

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

                  SET @sql = NULL;
                  

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

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

                  שוב תודה.

                  dovidD מנותק
                  dovidD מנותק
                  dovid
                  ניהול
                  כתב ב נערך לאחרונה על ידי dovid
                  #11

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

                  • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                  • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                  שואףש תגובה 1 תגובה אחרונה
                  4
                  • dovidD dovid

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

                    שואףש מנותק
                    שואףש מנותק
                    שואף
                    כתב ב נערך לאחרונה על ידי
                    #12

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

                    הכל נחוץ!

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

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

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

                    OdedDvirO תגובה 1 תגובה אחרונה
                    1
                    • שואףש שואף

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

                      הכל נחוץ!

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

                      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
                      • OdedDvirO OdedDvir

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

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

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

                        במקום

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

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

                        צדיק תמיםצ מנותק
                        צדיק תמיםצ מנותק
                        צדיק תמים
                        כתב ב נערך לאחרונה על ידי
                        #14

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

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

                        תגובה 1 תגובה אחרונה
                        2
                        • שואףש שואף

                          אני מנסה להגדיר את השאלה שלי, מקווה שתבינו אותה.

                          נניח יש לי חנות, ולקוחות מזמינים כל חודש סחורה.
                          לצורך הענין בשלש חודשים ראשונים של השנה:
                          ראובן הזמין ב10 20 30
                          שמעון 100 200 300
                          לוי 1000 2000 3000

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

                          התחלתי בשלב ראשון לכתוב שאילתא כזו לבד, לשלשת הלקוחות האלה
                          http://sqlfiddle.com/#!9/11e8be/11/0
                          אבל משום מה זה מחזיר תשובה רק על ראובן. אני מפספס משהו ולא תופס מה זה.

                          כשלב שני, אני מחפש איך להכין פונקציה בMYSQL (עם שילוב של PHP אני יודע לעשות, אבל יש לי ענין שיהיה דווקא בMYSQL, אסביר אחר כך למה), שתכין את הטבלא הזו לכל הלקוחות בטבלא, דהיינו בלי שיהיה כתוב במפורש בשאילתא למיין לפי השם של הלקוח פלוני ואלמוני.

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

                          אפר שריפהא מנותק
                          אפר שריפהא מנותק
                          אפר שריפה
                          כתב ב נערך לאחרונה על ידי
                          #15

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

                          שואףש Y.Excel.AccessY 2 תגובות תגובה אחרונה
                          1
                          • אפר שריפהא אפר שריפה

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

                            שואףש מנותק
                            שואףש מנותק
                            שואף
                            כתב ב נערך לאחרונה על ידי
                            #16

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

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

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

                            תגובה 1 תגובה אחרונה
                            1
                            • אפר שריפהא אפר שריפה

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

                              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
                              • דף הבית
                              • קטגוריות
                              • פוסטים אחרונים
                              • משתמשים
                              • חיפוש
                              • חוקי הפורום