ABA


"שאלה/עזרה - מה הטכניקה בכדי לשטח טבלה (SQL)"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #10014 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 10014
ohad23
חבר מתאריך 1.7.02
20620 הודעות
   21:33   03.08.10   
אל הפורום  
  שאלה/עזרה - מה הטכניקה בכדי לשטח טבלה (SQL)  
 
שלום

יש לי טבלה המציגה 3 עמודות
1.מספר לקוח
2.חודש
3.כמות פעולות

אני מעוניין ליצור טבלה חדשה על בסיס טבלה זו אבל בצורה שטוחה כלומר כל לקוח מקבל שורה אחת בלבד ועמודה לכל חודש בא מצויין מספר הפעולות

באיזה טכניקה משתמשים?
אני מבין שצריך לכתוב תוכנית קטנה שתעשה את זה...
אני מבין טוב SQL אבל עדיין לא התנסתי בכתיבת תוכנית כזו

אשמח לקבל הסבר קצר או אפילו לינק לאתר אינטרנט שנותן דוגמא כיצד לבצע זאת

תודה
אני עובד עם PL SQL של oracle



                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  יש פתרון די יפה לבעיה הזאת, akoka2 03.08.10 23:51 1
     תודה ohad23 04.08.10 11:25 2
         אז אתה פשוט תצטרך לכתוב פונקציה/פרוצדורה akoka2 04.08.10 11:30 3
             יפה! בדיוק פה אני צריך עזרה ohad23 04.08.10 20:17 4
                 זה נראה לי פשוט סרט לעשות את זה, akoka2 05.08.10 00:01 5
  שאני אבין: יש לך משהו כזה: Ice Cold  05.08.10 11:20 6
     ממש לא, akoka2 05.08.10 13:57 8
         צודק לא קראתי נכון את הדרישה שלו חחח Ice Cold  05.08.10 15:37 11
  מכתב Deuce  05.08.10 12:34 7
     אממ מסכים שזה לא יהיה פשוט בSQL נטו לבצע את זה, akoka2 05.08.10 13:59 9
         תודה לכם. הבנתי את הרעיון הכללי אני אסתדר מכאן ohad23 05.08.10 14:53 10
  הייתי עושה משו בסגנון XpDuDe  12.08.10 21:06 12

       
akoka2

   23:51   03.08.10   
אל הפורום  
  1. יש פתרון די יפה לבעיה הזאת,  
בתגובה להודעה מספר 0
 
   כרגע הטבלה שלך מנורמלת לפי החוקים הכי בסיסיים, מה שאתה צריך לעשות זה להוציא אותה מנרמול, ואת זה עושים עם Pivot וUnPivot, טוב שאורקל תומכים בזה, אני יודע שבMySQL זה הרבה יותר מסובך.

http://www.oracle-base.com/articles/11g/PivotAndUnpivotOperators_11gR1.php


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ohad23
חבר מתאריך 1.7.02
20620 הודעות
   11:25   04.08.10   
אל הפורום  
  2. תודה  
בתגובה להודעה מספר 1
 
קראתי על הפונקציונליות הזו של אורקל הקיימת בגרסה 11g
בארגון שאני עובד בו יש את גרסה 10 שלא תומכת ב pivot



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
akoka2

   11:30   04.08.10   
אל הפורום  
  3. אז אתה פשוט תצטרך לכתוב פונקציה/פרוצדורה  
בתגובה להודעה מספר 2
 
   שמבצעת את זה לבד.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ohad23
חבר מתאריך 1.7.02
20620 הודעות
   20:17   04.08.10   
אל הפורום  
  4. יפה! בדיוק פה אני צריך עזרה  
בתגובה להודעה מספר 3
 
רציתי לקבל דוגמא של פרוצדורה שעושה את מה שתיארתי,
תוכל עזור בזה?
או אולי לתת לי קישור לדף אינטרנט שנותן דוגמא לפרוצדורה דומה
תודה



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
akoka2

   00:01   05.08.10   
אל הפורום  
  5. זה נראה לי פשוט סרט לעשות את זה,  
בתגובה להודעה מספר 4
 
   ואני קטונתי מלחשוב על זה בכלל, לא חושב שיותר מדי אנשים כאן יוכלו לעזור לך, תנסה למצוא אולי אופציה של Encode/Decode לטבלה יכול ליהיות שזה יעזור לך.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Ice Cold  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 3.8.02
28041 הודעות, 19 פידבק
   11:20   05.08.10   
אל הפורום  
  6. שאני אבין: יש לך משהו כזה:  
בתגובה להודעה מספר 0
 

UserId Month Transactions
1 10 3
2 8 5
1 8 7
2 8 11
1 10 4

ואתה רוצה להוציא משהו כזה בטבלה אחרת:


UserId Month Transactions
1 10 7
2 8 16
1 8 7

? הבנתי נכון ?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
akoka2

   13:57   05.08.10   
אל הפורום  
  8. ממש לא,  
בתגובה להודעה מספר 6
 
   הוא רוצה משהו כזה


User_Id Month_1 Month_2 ... Month12
1 T_Count T_Count ... T_Count
4 T_Count T_Count ... T_Count
2 T_Count T_Count ... T_Count
5 T_Count T_Count ... T_Count
8 T_Count T_Count ... T_Count

Pivot זאת הדרך הפשוטה בOracle 11G אבל הוא אומר שהוא עובד עם 10, ושם אין תמיכה לזה.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Ice Cold  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 3.8.02
28041 הודעות, 19 פידבק
   15:37   05.08.10   
אל הפורום  
  11. צודק לא קראתי נכון את הדרישה שלו חחח  
בתגובה להודעה מספר 8
 


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   12:34   05.08.10   
אל הפורום  
  7. מכתב  
בתגובה להודעה מספר 0
 
עדיף לכתוב את זה לדעתי ב-PHP למשל מאשר ב-SQL.
אתה מבצע שליפה אחת של כל הטבלה ומטריצה של USER ID ו-12 חודשים. וכל פעם מעדכן את השדות המתאימים (+1) בחודשים.

לבסוף אתה יוצר טבלה חדשה.
אתה רוצה שאני ארשום לך ממש את הקוד? זה דיי פשוט.

במידה ואתה חייב לרשום את זה ב-SQL אז זה קצת יותר מסובך, כי השפה לא נוחה. תצטרך לחפש על מערכים או לבצע הרבה UPDATES ו-INSERTS שזה לא יעיל.







                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
akoka2

   13:59   05.08.10   
אל הפורום  
  9. אממ מסכים שזה לא יהיה פשוט בSQL נטו לבצע את זה,  
בתגובה להודעה מספר 7
 
   אבל במידה והוא רוצה לשמור את הנתונים בצורה הזאת אין לו ברירה, יש לזה כמה ייתרונות די ברורים.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ohad23
חבר מתאריך 1.7.02
20620 הודעות
   14:53   05.08.10   
אל הפורום  
  10. תודה לכם. הבנתי את הרעיון הכללי אני אסתדר מכאן  
בתגובה להודעה מספר 9
 



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
XpDuDe 
חבר מתאריך 16.5.10
1046 הודעות
   21:06   12.08.10   
אל הפורום  
  12. הייתי עושה משו בסגנון  
בתגובה להודעה מספר 0
 
   ערכתי לאחרונה בתאריך 12.08.10 בשעה 21:17 בברכה, XpDuDe
 
צור טבלה חדשה עם העמודות שאמרת (מספר לקוח ו12 חודשים), כאשר תאתחל כל חודש בדיפולט 0
תכניס שורה עבור כל לקוח, שזה פשוט עם שאילתת insert ששולפת מהטבלה הקודמת עם group by לפי ה-id (אם אתה מסתבך עם זה אין לי בעיה לרשום)

שאילתת pl/sqlתראה משהו בסגנון הזה(יש מצב אני טועה קצת בסינטקס, הרבה זמן מאז שתכנתתי בזה)

begin
for user in (select id, month, actions from old_table)
loop

execute immediate 'update flat_table set ' || user.month || '=' || user.actions || ' where id = ' user.id || '

end loop
end

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

עדכון : לא יודע למה זה מיושר לי לימין.. תעשה קופי פייסט למקום אחר בשביל לראות נורמלי


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net