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

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

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

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

מתוזמן נעוץ נעול הועבר תכנות
17 פוסטים 7 כותבים 367 צפיות 7 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • צבי-שצ צבי-ש

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

    כשאתה מדפיס את התוצאה של השאילתה הוא מדפיס לפי הערך monthYear ומציג ערך אחד בלבד ששווה ל 01-2022 למשל יציג לך רק את ראובן ב 01-2022 כי הוא כבר הדפיס משהו מ 01-2022.
    ולכן לדוגמא אם תמחוק את ההכנסה של הנתונים של ראובן של 01-2022 ותדפיס תראה שפתאום את שמעון הוא גם מדפיס. (את 01-2022)
    כלומר כשאתה ממין לפי הערך הזה הוא ידפיס רק אחד מכל ערך.
    לסיכום, נראה ש GROUP BY monthYear
    מכניס לקבוצה רק ערך אחד מכל סוג ולא את הכל.

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

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

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

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

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