עמודות מחושבות המתבססות זו על זו

15/08/2012

אין תגובות

נניח שאנחנו מעוניינים להפיק דוח אילו אובייקטים השתנו ומתי (דוגמה מעט מאולצת להמחשה בלבד):

Select  name,

        Create_Date,

        modify_date,

        DateDiff(Day,create_date,modify_date) DayDiff,

        Case When DayDiff=0 Then 'Not Changed' Else 'Changed' End Changed,

        Case When Changed='Changed' And DateDiff(Year,modify_date,GetDate())<=1 Then 'Recently Changed' End [When]

From    sys.objects;

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

DayDiff – מחשבים כמה ימים עברו בין היצירה לשינוי,

Changed – אם התוצאה 0 מציגים הודעה שהאובייקט לא השתנה ואחרת להיפך,

When – ואם הוא השתנה וזה קרה במהלך השנה האחרונה – מציינים שהשתנה לאחרונה.

ננסה להריץ ומה נקבל?

clip_image002

אופס: אמנם חישבנו עמודה בשם DayDiff, אך היא אינה מוכרת בעמודה הבאה אחריה ש"רואה" רק את העמודות המקוריות של הטבלה ולא את זו שחישבנו קודם;

וכך גם עם העמודה Changed עצמה (שבכל מקרה לא הצלחנו לחשבה) ושאינה מוכרת לבאה אחריה..

מה עושים?

פתרון אחד הוא לבצע את החישובים מחדש- בחישוב של Changed נציב את כל ה-()DateDiff במקום DayDiff,

ואת כל Change – עם ה-Case ועם ה-()DateDiff נציב בחישוב של When.. מסורבל להחריד!

פתרון אחר הוא לקנן (To Nest) שאילתות משנה: ניצור שאילתת משנה שתכלול את החישוב של DayDiff,

מהשאילתה הראשית נפנה אליה ונוכל לחשב את Changed,

ואת כל זה נהפוך לשאילתת משנה גדולה שנוכל לפנות אליה ולחשב את When על פי Changed וכך הלאה.

יותר אלגנטי מהקודם, אך אולי יש עוד אפשרות?

Select  name,

        Create_Date,

        modify_date,

        T1.DayDiff DayDiff,

        T2.Changed Changed,

        T3.[When] [When]

From    sys.objects

Cross Apply (Select DateDiff(Day,create_date,modify_date) DayDiff) T1

Cross Apply (Select Case When DayDiff=0 Then 'Not Changed' Else 'Changed' End Changed) T2

Cross Apply (Select Case When Changed='Changed' And DateDiff(Year,modify_date,GetDate())<=1 Then 'Recently Changed' End [When]) T3;

clip_image004

השימוש ב-Cross Apply מאפשר לנו לפנות לעמודות שכבר נוצרו גם ביצירת עמודות נוספות וגם בפסוקית ה-Where שבדרך כלל לא ניתן לציין בה שמות עמודות שנוצרו ב-Select.

אפשר כמובן לחשב בכל Cross Apply מספר עמודות כל עוד הן אינן מתייחסות זו לזו,

ובמקרה זה- מכל Cross Apply ניתן לפנות לעמודות שחושבו ב-Cross Aplies הקודמים.

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *