עזרה ב- SQL

Ellad Lerner

New member
עזרה ב- SQL

שלום לכולם בניתי דוח המבוסס שאילתה SQL המציגה נתון מסוים ע"פ חלוקה לחודשים: Select DC_DTRDATE, Sum(DC_RDSPAYSTATUS * DC_RDSDISTANCE * DC_DTRCARQTY) as FPAYPREDICATE, Convert(Varchar(8), dbo.CwDate2Sql(DC_DTRDATE), 3) as FDATE, case str(DatePart(mm,dbo.cwDate2Sql(DC_DTRDATE))) when 1 then 'ינואר' when 2 then 'פברואר' when 3 then 'מרץ' when 4 then 'אפריל' when 5 then 'מאי' when 6 then 'יוני' when 7 then 'יולי' when 8 then 'אוגוסט' when 9 then 'ספטמבר' when 10 then 'אוקטובר' when 11 then 'נובמבר' when 12 then 'דצמבר' else '' end as monthdescr, str(DatePart(mm,dbo.cwDate2Sql(DC_DTRDATE))) as [חודש] From Job_Open where (99=99) Group By DC_DTRDATE Order By [חודש] ,הנתון עבורו אני מחשב חלוקה ע"פ חודשים הוא FPAYPREDICATE כפי שניתן לראות בשאילתה כעת אני מעוניין להציג גידול בדוח ע"פ החלוקה לחודשים ונתקעתי אשמח אם מישהו יוכל לכתוב לי שאילתה או ישדרג את השאילתה שאני כתבתי בכדי לקבל גידול באחוזים ביחס לחודשים תודה מראש :)
 

גרי רשף

New member
הדרכה

בגרסה הבאה של SQL SERVER תהיה תמיכה למציאת הערך הקודם או הבא, ובעזרתו תוכל לחשב את השינוי באחוזים. בינתיים הייתי עושה כך- את השליפה הנ"ל מכניס לתוך CTE (מקווה שאתה יודע מה זה- לא מסובך) ועושה לו Left Join עם עצמו לפי: אותה שנה וחודש גדול ב-1 או חודש 1 כאן חודש 12 שם והפרש של 1 בשנים. (לחילופין אפשר להשוות את הביטוי 12 כפול שנה ועוד מספר החודש ושיהיה הפרש 1). מקווה שהרעיון ברור..
 

Ellad Lerner

New member
תודה

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

גרי רשף

New member
אנסה

With T As (Select... ... ...) Select * From T As T1 Left Join T As T2 On 12*T1.Year+T1.Month=12*T2.Year+T2.Month+1​
ה-SELECT שבתוך הסוגריים הוא מה שאתה כתבת, נתנו לו את השם T, וכעת אפשר לעשות לו JOIN עם עצמו בלי לכתוב את הכל פעמיים.. כתבתי לך כבר את תנאי ה-ON. את חישוב אחוז השינוי עשה אתה.
 

sirpad

New member
כמו שגרי רשף אמר

בגרסאאמר גרסת הבאה של sql server, מיקרוסופט מרחיבים את היצע הפקודות שפה כדי לתמוך בצורך הזה שלך. לדעתי הבעיה בשאילתה שלך היא שהיא דורשת ביצוע שהוא בהגדרה לא נתמך עי מסד נתונים ריליישיונל relationel. הכלים הנכונים לפתרון בעיות מסוג זה הם מסד נתונים מסוג olap, multi dimensional, במילים אחרות קוביה, או analysis services . ובעתיד גם טאבולאר או power pivot. מדובר בטכנולוגיה שונה של שמירת נתונים, שבניגוד לרילשיונל שומר יחד עם כל תא גם מידע על הקואורדינטות של המידע במרחב של שאר הנתונים, כך שכל פיסת מידע יכולה להתייחס ישירות, בלי צורך בלעשות join, לפיסות מידע אחרות. תחשוב לדוגמא שאתה יכול לכתוב שאילתה כזו: הצג נתוני מכירות שבועיים, וצמיחה ביחס לשבוע שעבר, וצמיחה ביחס לתקופה מקבילה אשתקד, אחוז מכלל הקטגוריה הגבל למוצרים מתת קטגוריה x ולכל השבועות בשנת 2011 כדי לכתוב כזה דבר בsql, אתה צריך לעשות כל כך הרבה פעמים join, בעוד שבמולטי דימנשיונל, כל שבוע ״יודע״ מהו השבוע שלפני, ו״יודע״ מהו השבוע המקביל משנה שעברה, הוא גם ״יודע״ באיזה קטגוריה נמצאת תת קטגוריה x, וכיצד לחשב את הסבך לקטגוריה הזו. למרות שכאמור הדברים ישתנו בעתיד, אולי, אני ממליץ להתעמק קצת במסדי נתונים שמיועדים בדיוק לדרישות האלה, ולא לאנוס את הsql למה שהוא לא אמור להיות, כי זה בשורה התחתונה לא יתפקד בצורה יעילה.
 

Ellad Lerner

New member
מסכים איתך

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

"...הכלים הנכונים לפתרון בעיות מסוג זה הם מסד נתונים מסוג olap, multi dimensional, במילים אחרות קוביה, או analysis services . ובעתיד גם טאבולאר או power pivot." ברצינות? הפונקציה שאתה מחפש קיימת באורקל מגרסה 8. ובעברית - משנת 1999. יכולת מקבילה, קיימת ב- db2 מגרסה 9.5 בתרגום לזמן - משנת 2009. MySql, בסיס נתונים חינמי, גם מספק את היכולות האילו. (שם אני לא סגור על השנה - אבל זאת יכולת קיימת!) כל מסדי הנתונים האילו הם רלצייונים. קוראים לנושא הזה פונקציות אנליטיות - תקרא קצת, זה רק יעזור לך בחיים להתרחק קצת מהעדר של מיקרוספט. הפורום הזה טוב, אבל מתמקד יותר על המידה באקסס/sql-server....
 

Ellad Lerner

New member
אולי אתה תוכל לעזור

יש לך דרך יותר פשוטה להציג גידול באחוזים לפי חודשים??
 
אם היית עובד ב- rdbms נורמלי

היה לך יותר קל... ביינתים, מה שגרי כתב לך נראה בשבילי (ואני לא מבין גדול ב- Sql-Server) כמו הדרך היחידה. נ"ב - הכותרת שלי התייחסה לתגובה של sirpad ולא אליך.
 

sirpad

New member
אתה מוזמן להרחיב במקום להקניט

אולי תכתוב שאילתה בPL SQL כדי שנדע איך זה נעשה בפועל?
 

sirpad

New member
אגב, בדיקה קלה בגוגל לימדה אותי

שהפונקצית האנליטיות הללו שאתה מדבר עליהן, הן אכן אותו הדבר שמיקרוסופט הוסיפו לSQL SERVER 2012, אבל זו לא הנקודה, שכן גם הפונקציות הללו מותנות בסידור מסויים של הנתונים, כדי שניתן יהיה לעשות LAG או LEAD, בשאילתה עצמה. יהיה מעניין איפוא להשוות ביצועים בין קוביה ו MDX לבין SQL עם פונקצית חלון, כמו שמיקרוסופט בחרו לקרוא לפונקציות הללו. אגב, מה שקוביה נותנת לך, שום פונקציה אנלטית לא תתן, וזה את האפשרות שמשתמש טיפש פותח אקסל, עושה מה שבא לו, בונה לבד דוח, והכל תמיד נשאר בקונטסקט. אבל זה כבר נושא אחר לגמרי.
 
תשובות ל- sirpad

אכן יהיה מעניין להשוות בין מוצר ייעודי של מיקרוסופט, שדורש הכשרה, לבין שאילתה פשוטה באורקל. וכן, מיקרוסופט צמצמה פערים, והיא גם עשתה את זה מהר. כאמור, באורקל היכולת הזאת קיימת מ- 1993. נ"ב 1 לאורקל יש יכולת נוספת, מ- 2003 (גרסה 10, למי שתוהה) להתייחס בתוך שאילתה, לתוצאות שמוחזרות ולהפעיל עליהן ניתוחי דמויי "גיליון אלקטרוני". זה היה יכול להיות קילר פיצ'ר, אבל התחביר של זה קצת מאיים על המשתמש הזוטר (; נ"ב 2, רק לשם הדייקנות (אני מזל בתולה, זה חזק ממני), שפת pl/sql היא שפה שמשתמשים בה על מנת לכתוב sp. "סתם" שאילתה באורקל, לא דורשת ידע ב- pl/sql אלא רק בשפת sql. אם המפרסם המקורי של השאלה, היה מוסיף ddl ו- dml על מנת ליצור את הטבלה ולאכלס אותה, אפשר היה להראות לו, כמה זה פשוט באורקל.
 

sirpad

New member
למרות מזלך

אני מתייחס לכל הרחבה שיש לתקן SQL שקיימת רק במוצר מסויים, נניח אורקל או MSSQL, כאל חלק מהשפה המיוחדת של המוצר, קרי PLSQL או TSQL ולא כחלק מהתקן שאמור להיות מיושם על ידי כל המוצרים.
 

גרי רשף

New member


1. התנסחויות בסגנון של "תקרא קצת, זה רק יעזור לך בחיים להתרחק קצת מהעדר של מיקרוספט" אינן לעניין: אף אחד כאן איננו "עדר". 2. אם אתה לא מבין גדול ב-SQL Server (כדבריך), איך אתה יודע שאינו RDBMS נורמלי? 3. "הפורום הזה טוב, אבל מתמקד יותר על המידה באקסס/sql-server" : חן חן על המחמאות. הפורום מתמקד בלעזור למי שצריך על ידי מי שיכול. שאלו על SQL Server, ומי שמתמצא ענה. 4. כשמישהו שואל אותי איך מגיעים לבת-ים אני משתדל לכוון אותו כמיטב יכולתי, במקום להסביר שאין לו מה לחפש בבת-ים ושעדיף שיסע להרצליה.
 
תשובות לגרי

גרי – 1. נכון. צודק. אני מתנצל אם מישהו נעלב. מצד שני זה בהחלט עורר את הפורום (; 2. ההשוואה הייתה מול שלושה rdbms, נפוצים לא פחות. אם אין את היכולת המרשימה הזאת ל- SQL-SERVER, אז הוא לא תואם לתקן ANSI-SQL (2003). זה לא אומר כמובן, שהוא "לא נורמלי", אבל זה בהחלט מינוס. 3. המסה הקריטית של השאלות והתשובות מתמקדת ב- SQl-Server ובאקסס. זה מעגל שמזין את עצמו, מי שמתעסק עם rdbms-ים אחרים, לא ייפנה לפורום הזה. 4. נכון. התגובה שלי הייתה מכוונת ל- Sirpad.
 

גרי רשף

New member
אתה מתמנה בזאת למוביל תחום האוראקל בפורום

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

zalomon

New member
לגבי mysql - טעות בידך

אין ל-mysql תמיכה או מימוש של analytic functions. לא צפוי להיות בזמן הקרוב משום שלא הודיעו שעובדים על כזה דבר.
 

zalomon

New member
הנה אזמין את עצמי

Alex Bolenok המוכשר מתאר בפוסט איך אפשר לסמלץ analytic functions ב-mysql, והוא עושה זאת היות ואין ב-mysql מימוש של analytic functions. הבעייה, כמובן, היא שמדובר בסימולציה, ואיננה חלק מהקוד. אז מה? אז תצטרך מראש להגדיר על הטבלה את האינדקסים המתאימים לסימולציה שתרצה להריץ (לא נורא), ותצטרך להתמודד (בדוגמה שלו) עם 4 תת שאילתות שמסמלצות analytic functions. הבעייה כאן היא שהביצועים של תתי שאילתות ב-mysql הם גרועים, ורק היום מתחילים לפתור את הבעיות, וגם זה לא ב-mysql המקורי אלא ב-fork שלו שנקרא mariadb. אם תמשיך ותקרא תגלה שכדי להתמודד עם מגבלת סינטקס של mysql אלכס נאלץ לממש stored routines. גם שם מדובר בדרדור הביצועים בצורה משמעותית, מכל כך הרבה סיבות שתיאלץ לשלוח לי כרגע על כך שאינני מפרטן. שים לב שהפתרון של אלכס הוא מורכב ביותר, ובא לפתור שאילתא *מסוימת*. עבור כל שאילתא אחרת תצטרך לייצר סימולציה שונה לגמרי. אינני מכיר אותך באופן אישי. רוב האנשים לא ידעו לשלוף פתרון שכזה בקלות או בכלל. בקיצור: זה שאפשר להריץ סימולציה של analytic functions לא אומר ש-mysql תומך בהן.
 
למעלה