עזרה בשאילתא

reut125

New member
עזרה בשאילתא

SELECT
x.[FirmCode]
,x.[CustomerCode]
,x.[CustomerKey]
,x.[RefundDate]
,x.Details
,SUM(x.[RefundAmnt]) AS [RefundAmnt]
,SUM(x.[ParentRefundAmnt]) AS [ParentRefundAmnt]
,SUM(x.[AcntRefundAmnt]) AS [AcntRefundAmnt]
FROM (SELECT
rf.[FirmCode]
,rf.[CustomerCode]
,c.[CustomerKey]
,rf.[RefundDate]
,rf.Details
,rf.[RefundAmnt]
,rf.ParentRefundAmnt
,rf.AcntRefundAmnt
FROM [pFactRefund] rf
INNER JOIN [DimCustomer] c ON c.[CustomerCode]=rf.[CustomerCode] AND c.[FirmCode]=rf.[FirmCode] AND c.Type!='ר'
)x
GROUP BY x.[FirmCode]
,x.[CustomerCode]
,x.[CustomerKey]
,x.[RefundDate]
,x.Details

זאת השאילתא אני מבינה חלקית מה היא אומרת אבל לא לעומק.. יש מצב שמישהו יכול לעזור לי..?
 

Juventini1

New member
תשובה

היי רעות,
אז ככה, השאילתה שלפנייך עושה שימוש בשאילתה פנימית, המכונה בשם כללי Sub-Query. ל-Sub-Queries יש כמה סוגים, ולסוג שמופיע בשאילתה שלך קוראים Derived Table.
אסביר, יש לך את השאילתה החיצונית, והשאילתה הפנימית (זו שמוקפת בסוגריים היא הפנימית).
הרעיון של Derived Table, הוא להתייחס אל השאילתה הפנימית כמעין טבלה, לכן לכל עמודה חייב להופיע Alias (כמו שמופיע בשאילתה שלך). ובנוסף גם לכל השאילתה הפנימית צריך לתת שם (במקרה שלך הוא X), וזאת כדי שנוכל באמת לפנות את "הטבלה" שעכשיו יצרנו. בשאילתה החיצונית שלך את יכולה לבצע פעולות חישוביות, אגריגציות, קיבוץ נתונים על "הטבלה" שנוצרה מהשאילתה הפנימית.
מקווה שהצלחתי להסביר בצורה ברורה,במידה ולא, אל תתביישי לשאול!
 

reut125

New member
קודם כל תודה ויש לי שאלה :)

קודם כל ממש תודה רבה :)
אבל האמתי שקצת הלכתי לאיבוד
אם אני מבינה נכון בסופו של דבר אני מקבלת מהשאילתא טבלה עם 5 עמודות שזה בידיוק אותן עמודות שהיו לי לפני רק אם השינויים שביקשתי לעשות בעזרת הפקונציות הפנימיות??:
FirmCode
,CustomerCode
,CustomerKey
,RefundDate
,Details
 

Juventini1

New member
תשובה

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

reut125

New member
תודה ושאלה אחרונה :)

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

Juventini1

New member
תשובה + קובץ עם דוגמא והסברים

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

pitoach

New member
Juventini1 מה ז"א אין מה להודות ? זה נימוס

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


לגבי מי שיש לו בעיה של ניתוח שאילתות מורכבות יש לי הצעה שבדרך כלל עובדת.

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

SELECT
rf.[FirmCode]
,rf.[CustomerCode]
,c.[CustomerKey]
,rf.[RefundDate]
,rf.Details
,rf.[RefundAmnt]
,rf.ParentRefundAmnt
,rf.AcntRefundAmnt
FROM [pFactRefund] rf
INNER JOIN [DimCustomer] c ON c.[CustomerCode]=rf.[CustomerCode] AND c.[FirmCode]=rf.[FirmCode] AND c.Type!='ר'

עכשיו מוחקים את השאילתה הפנימית ושמים במקומה את השם של הטבלה שנתנו לה. למשל כאן כל מה שחוזר מהשאילתה הפנימית יהיה חלק מטבלת התוצאה שנתנו לה את השם X ואז מקבלים שאילתה פשוטה יחסית:
SELECT
x.[FirmCode]
,x.[CustomerCode]
,x.[CustomerKey]
,x.[RefundDate]
,x.Details
,SUM(x.[RefundAmnt]) AS [RefundAmnt]
,SUM(x.[ParentRefundAmnt]) AS [ParentRefundAmnt]
,SUM(x.[AcntRefundAmnt]) AS [AcntRefundAmnt]
FROM x
GROUP BY x.[FirmCode]
,x.[CustomerCode]
,x.[CustomerKey]
,x.[RefundDate]
,x.Details

כשכותבים שאילתה מורכבת העבודה דומה. מתחילים בשרך כלל מהשאילתה הפנימית החוצה.
 
למעלה