none
שאלה בנושא SQL RRS feed

  • שאלה

  • הי,
    יש לי שאילתא עבורה אני אמורה לכתוב סינטקס, כמובן בהתבסס על DB
    השאילתא הינה: "יש לאחזר עבור כל חודש את העובד שמכר הכי הרבה יחידות מוצר"
    מדובר ב JOINים של מספר טבלאות וכך התחלתי ופה אני תקועה:

    SELECT  [LastName] + ' ' + [FirstName] EMPLOYEE_NAME, [Month], SUM(P.[UnitsOnOrder]) TOTALSALE
    FROM [dbo].[Employees] E
    JOIN [dbo].[Orders] O ON O.EmployeeID = E.EmployeeID
    JOIN [dbo].[Order Details] OD ON OD.OrderID = O.OrderID
    JOIN [dbo].[Products] P ON P.ProductID = OD.ProductID
    JOIN [dbo].[Time] T ON T.PK_Date = O.OrderDate

    פה אני תקועה ולא יודעת ממש איך להמשיך
    לדעתי אני צריכה להוסיף SUB QUERY ואולי פונקציה של MAX ולא SUM

    בכל אופן אשמח לעזרתכם, חדשה בתחום ובתחילתו של קורס BI

    תודה רבה רבה
    יום שני 01 אפריל 2013 13:50

תשובות

  • הי,

    את בהחלט בכיוון הנכון.

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

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

    (ROW_NUMBER () OVER (PARTITION BY Month ORDER BY TotalSale DESC

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

    מידע על GROUP BY תוכלי למצוא כאן: http://msdn.microsoft.com/en-us/library/ms177673.aspx

    מידע על ROW_NUMBER תוכלי למצוא כאן: http://msdn.microsoft.com/en-us/library/ms186734.aspx

    בהצלחה!

    -----------------------------
    גיא גלנצר
    יועץ ומדריך SQL Server
    Madeira - SQL Server Services
    http://www.madeira.co.il

    יום שלישי 02 אפריל 2013 04:54
    מנחה דיון
  • היי!

    את פחות או יותר בכיוון. בתת-שאילתא את צריכה להחזיר את

    EmployeeName, Month, OrderID, sum(ItemID)

    יש לבצע JOINS מתאימים וגם את 

    GROUP BY EmployeeName, Month, OrderID

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

    EmployeeName, Month, TotalItems

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

    GROUP BY EmployeeName, Month HAVING TotalItems = max(TotalItems)

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

    • נערך על-ידי Ivan Radchenko יום שלישי 02 אפריל 2013 05:17
    • סומן כתשובה על-ידי pituachMVP, Editor יום שני 08 אפריל 2013 14:23
    יום שלישי 02 אפריל 2013 05:12

כל התגובות

  • הי,

    את בהחלט בכיוון הנכון.

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

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

    (ROW_NUMBER () OVER (PARTITION BY Month ORDER BY TotalSale DESC

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

    מידע על GROUP BY תוכלי למצוא כאן: http://msdn.microsoft.com/en-us/library/ms177673.aspx

    מידע על ROW_NUMBER תוכלי למצוא כאן: http://msdn.microsoft.com/en-us/library/ms186734.aspx

    בהצלחה!

    -----------------------------
    גיא גלנצר
    יועץ ומדריך SQL Server
    Madeira - SQL Server Services
    http://www.madeira.co.il

    יום שלישי 02 אפריל 2013 04:54
    מנחה דיון
  • היי!

    את פחות או יותר בכיוון. בתת-שאילתא את צריכה להחזיר את

    EmployeeName, Month, OrderID, sum(ItemID)

    יש לבצע JOINS מתאימים וגם את 

    GROUP BY EmployeeName, Month, OrderID

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

    EmployeeName, Month, TotalItems

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

    GROUP BY EmployeeName, Month HAVING TotalItems = max(TotalItems)

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

    • נערך על-ידי Ivan Radchenko יום שלישי 02 אפריל 2013 05:17
    • סומן כתשובה על-ידי pituachMVP, Editor יום שני 08 אפריל 2013 14:23
    יום שלישי 02 אפריל 2013 05:12