דשבורד מכירות שכל מספר בו מגיע ממדד שאתם כותבים מאפס, עם חיווי צבע אוטומטי
לנציגי המכירות. עובדים על Retail_StarSchema_PowerBI.xlsx — סכמת כוכב עם 11 טבלאות,
36,607 שורות ושני ענפי Snowflake. 27 תרגילים, כל אחד בדף נפרד ועם פתרון מלא. שימו לב: ההורדה
והתרגול הם במחשב בלבד — Power BI Desktop אינו קיים בטלפון.
הנתונים סינתטיים. שמות המדינות והערים אמיתיים, אבל כל לקוח, מוצר, נציג
והזמנה בקובץ נוצרו באופן מלאכותי.
המודל. טבלת העובדות המרכזית Fact_Sales בגרעין של שורת מוצר
בהזמנה, ולצידה Fact_Returns ו-Fact_SalesTargets. שמונה מימדים, מתוכם שני
ענפי Snowflake בכוונה תחילה: Dim_Geography → Dim_Customer ו-
Dim_ProductCategory → Dim_Product. 11 קשרים, כולם אחד-לרבים בכיוון
Single מהמימד אל העובדה. סמנו את Dim_Date כטבלת תאריכים עם
Full_Date.
שלוש נקודות שיחסכו לכם זמן. (1) Dim_Promotion כולל חבר עם מפתח
0 בשם No Promotion, כדי שלא יהיו מפתחות ריקים בטבלת העובדות. (2)
Fact_SalesTargets בגרעין חודשי בעוד המכירות יומיות — חיבור דרך
Month_Start_Date_ID. (3) Ship_Date הוא עמודת תאריך רגילה ולא מפתח, כדי לא
ליצור קשר שני ל-Dim_Date; מי שרוצה לתרגל role-playing dimension יוסיף קשר לא פעיל
ויפעיל אותו עם USERELATIONSHIP.
מבנה המטלה
חלק 1
14 מדדי DAX
עשרה מדדי בסיס — SUM, DISTINCTCOUNT, DIVIDE, שני CALCULATE, ALL, IF ושני SWITCH — ושלוש פונקציות חלון: RANK, INDEX ו-WINDOW.
חלק 2
שני עמודי דשבורד
ארבעה קארדים על מגש, גרף עמודות, גרף קו, סלייסר שנה, טבלת נציגים, Top 10 מוצרים, Matrix וגרף משולב.
חלק 3
עיצוב מותנה כפול
אותה חלוקה לשלוש שכבות בשתי טכניקות: Rules בתוך ויזואל אחד, ומדד SWITCH שמזין את הצבע לכל ויזואל.
כל המספרים אומתו ב-pandas מול הקובץ
1.1 · Total Sales — מדד הבסיס
צרו מדד בשם Total Sales שמסכם את Fact_Sales[Net_Amount]. עצבו כמטבע עם מפריד אלפים.
Total Sales = SUM ( Fact_Sales[Net_Amount] )
יצירהקליק ימני על Fact_Sales ← New measure
עיצובFormat ← Currency ← 0 ספרות אחרי הנקודה
למה Net ולא Gross:Gross_Amount הוא לפני הנחה
(€67,937,751), Net_Amount אחרי (€62,929,759). ההפרש —
€5,007,992 — הוא ההנחה שניתנה במבצעים. שני המספרים נכונים, הם עונים על שתי שאלות
שונות, ולכן חייבים להגדיר מדד לפני שמתווכחים על מספר.
ומה עם החזרות: €2,364,425 הוחזרו ללקוחות
(3.76% מהמכירות), והם יושבים ב-Fact_Returns — לא מנוכים מהמדד הזה.
המכירות נטו-נטו הן €60,565,334. זה תרגיל בונוס מצוין.
תוצאה: €62,929,759 — מספר העוגן של כל המטלה.
1.2 · Total Orders — כמה הזמנות באמת
צרו מדד בשם Total Orders שסופר הזמנות ייחודיות על בסיס Fact_Sales[Order_Number].
Total Orders = DISTINCTCOUNT ( Fact_Sales[Order_Number] )
שימו לב לעמודה:Order_Number ולא
Sales_Line_ID. הזמנה עם כמה פריטים מופיעה בכמה שורות, ולכן
COUNT היה מחזיר 30,000 — שורות, לא הזמנות. הממוצע הוא
2.16 שורות להזמנה.
תוצאה: 13,892 הזמנות מתוך 30,000 שורות מכירה.
1.3 · Avg Order Value — עקרון הלגו
צרו מדד בשם Avg Order Value — אך ורק משני המדדים הקיימים, בלי סימן החלוקה / ובלי AVERAGE. עצבו לשתי ספרות.
Avg Order Value = DIVIDE ( [Total Sales], [Total Orders] )
ממוצע של מה:AVERAGE(Fact_Sales[Net_Amount]) היה
מחזיר את הממוצע לשורת הזמנה ולא להזמנה. כשהמדד בנוי משני מדדים קיימים, המכנה מוגדר
במפורש. DIVIDE עדיף על / כי הוא מחזיר ריק במקום שגיאה כשהמכנה אפס.
המדד מתגלגל אוטומטית: גררו אותו לטבלת הנציגים והוא יחזיר את
הסל הממוצע של כל נציג — ראו את התובנה בתרגיל 2.4.
תוצאה: €4,530 להזמנה.
1.4 · Total Profit — המדד השני
צרו מדד בשם Total Profit שמסכם את Fact_Sales[Gross_Profit]. בונוס: מדד Profit Margin % — DIVIDE של הרווח במכירות, כאחוז.
Total Profit = SUM ( Fact_Sales[Gross_Profit] )
Profit Margin % = DIVIDE ( [Total Profit], [Total Sales] )
העמודה נגזרת ולא אקראית:Gross_Profit =
Net_Amount פחות COGS, בכל אחת מ-30,000 השורות.
אפשר לאמת את זה ב-Power Query לפני שמתחילים.
255 שורות עם רווח שלילי (0.85%) —
מבצע של 25% שירד מתחת לעלות. זה קורה בדאטה אמיתי, וזו שאלת ניתוח טובה: איזה מבצע אכל
את הרווח.
תוצאה: €25,282,189 · שולי רווח 40.18%.
1.5 · Digital Sales — CALCULATE ראשון
צרו מדד בשם Digital Sales שמחזיר את המכירות בערוצים הדיגיטליים בלבד, עם CALCULATE ותנאי על Dim_Channel[Is_Digital].
מה קורה כאן: CALCULATE מוסיפה את התנאי לבועת הסינון ורק אז
מריצה את [Total Sales]. הפילטר יושב על עמודת טקסט בטבלת המימד וזורם דרך הקשר
אל 30,000 שורות העובדה — בלי שום JOIN.
הפירוק לפי ערוץ: Mobile App €13,038,227 · Retail Branch €12,512,458 · Web Store €12,493,313 · Telesales €12,491,849 · Partner Reseller €12,393,913
תוצאה: €25,531,540 — 40.57% מהמכירות.
1.6 · Promotion Sales — CALCULATE על מימד המבצעים
צרו מדד בשם Promotion Sales שמחזיר את המכירות שנעשו במבצע. הטריק: המימד כולל חבר בשם Standard Price שמייצג מכירה ללא מבצע — סננו אותו החוצה.
למה יש חבר "ללא מבצע": בלעדיו היו
15,990 שורות עם מפתח ריק, וכל ויזואל היה מציג
(Blank). חבר ברירת מחדל עם מפתח 0 הוא הפתרון המקובל — וזו הסיבה שבקובץ הזה
יש 0 מפתחות ריקים.
ההנחה שניתנה במבצעים: €5,007,992 — כמעט כל ההנחה
בקובץ. שווה לבנות מדד Discount Rate % ולראות מי הערוץ שמנצל אותה.
צרו מדד בשם % of All Sales: חלקו את [Total Sales] בסך הכל — CALCULATE שמסיר את הסינון מ-Dim_SalesRep באמצעות ALL. עצבו כאחוז, שתי ספרות.
% of All Sales =
DIVIDE (
[Total Sales],
CALCULATE ( [Total Sales], ALL ( Dim_SalesRep ) )
)
מה עושה ALL: המונה חי בבועה של השורה (נציג אחד), והמכנה
משוחרר מסינון ולכן תמיד מחזיק את כל החברה. בשורת ה-Total המונה שווה למכנה — וזו הבדיקה
שהמדד נכתב נכון.
תוצאה: הנציג המוביל מחזיק 3.01% · שורת ה-Total מציגה 100.00%.
1.8 · Rep Status — IF מול הממוצע
צרו מדד בשם Rep Status שמחזיר טקסט: "מעל הממוצע" אם הנציג עבר 1,570,000 יורו, ואחרת "מתחת לממוצע".
Rep Status =
IF ( [Total Sales] >= 1570000, "מעל הממוצע", "מתחת לממוצע" )
מאיפה 1,570,000: €62,929,759 ÷ 40 נציגים =
€1,573,244, מעוגל. המדד מחזיר טקסט ולכן מתאים לטבלה, לא לקארד מספרי.
תוצאה: 20 נציגים "מעל הממוצע" · 20 "מתחת" — חלוקה כמעט מושלמת לשניים.
ההיגיון של ארבעת המספרים:1, ABS = ראש הרשימה ·
0, REL = עוצרים אצלי. אם תחליפו ל-1, ABS ← 3, ABS תקבלו עמודה קבועה
עם סכום שלושת הגדולים — מילה אחת הופכת חלון נודד לחלון קבוע.
בדיקת שפיות מובנית: השורה האחרונה חייבת להיות בדיוק €62,929,759.
1.14 · Target Attainment — טבלת עובדות שלישית
צרו מדד בשם Total Target שמסכם את Fact_SalesTargets[Target_Amount], ואז Target Attainment % — המכירות חלקי היעד.
Total Target = SUM ( Fact_SalesTargets[Target_Amount] )
Target Attainment % = DIVIDE ( [Total Sales], [Total Target] )
הבדלי גרעין — הלקח המרכזי כאן: המכירות יומיות והיעדים
חודשיים. שתי הטבלאות מחוברות ל-Dim_Date בעמודות שונות
(Date_ID מול Month_Start_Date_ID), ולכן סינון של יום בודד יראה
מכירות בלי יעד. סננו לפי חודש או שנה, לא לפי יום.
מדד שלישי לבונוס:Total Refunds =
SUM ( Fact_Returns[Refund_Amount] ) — €2,364,425, שהם
3.76% מהמכירות. שלוש טבלאות עובדה תחת אותם סלייסרים.
תוצאה: יעד €63,014,903 · עמידה ביעד 99.86%.
2.1 · רקע, כותרת ומגש KPI
עמוד 1 של הדשבורד — רקע, כותרת ומגש שעליו יישבו הקארדים.
גווניםשלושה בלבד: נייבי #132449, זהב #F5C518 ואפור ניטרלי
רקעקליק על קנבס ריק ← Format your report page ← Canvas background ← גרסה בהירה של הנייבי ← Transparency = 0%
כותרתInsert ← Text box ← "חדר המצב של המכירות"
מגשInsert ← Shapes ← Rectangle ← רצועה רוחבית ← Rounded corners ← Send to back
הצורה חייבת לשבת מתחת לקארדים.
2.2 · תמונות — חיפוש והוספה
שני קבצי תמונה יהפכו את הדוח ממטלה לדוח שנראה מקצועי.
חיפושעגלת קניות או חנות ברקע שקוף — הוסיפו transparent PNG וסננו ב-Tools ← Color ← Transparent
גודלרוחב 300px לפחות
הוספהInsert ← Image ← פינת הכותרת, גובה כ-60 פיקסלים
יחסFormat image ← Scaling = Fit, גרירה מפינה בלבד
אל תשתמשו בלוגו של רשת קמעונאית אמיתית — הנתונים מומצאים. תמונה גנרית מ-Unsplash או Pexels.
2.3 · ארבעת הקארדים
בנו 4 קארדים מעל המגש. עצבו אחד במלואו ואז שכפלו ×3 והחליפו את השדה.
Total Sales · Total Orders · Avg Order Value · Total Profit
ארבעת הקארדים והערכים המאומתים
קארד
המדד
ערך שיוצג
מכירות
Total Sales
€62,929,759
הזמנות
Total Orders
13,892
סל ממוצע
Avg Order Value
€4,530
רווח
Total Profit
€25,282,189
מלכודת תצוגה:Total Orders חייב
Display units = None, אחרת יוצג "13.9K". בקארדי הכסף קבעו
Currency עם 0 ספרות כדי שהארבעה ייראו אחידים.
יישרו: Ctrl+Click ← Group ← Distribute horizontally ← Align top.
2.4 · גרף עמודות — מכירות לפי נציג
בנו Clustered column chart עם Dim_SalesRep[SalesRep_Name] בציר X ו-[Total Sales] בציר Y. מיון יורד, Data labels = On.
שימו לב כמה הליגה צפופה: Kenji Smith מוביל עם
€1,896,727 ו-Piotr Levi סוגר עם €1,241,220 — פער של
53% בלבד בין הראשון לאחרון מתוך 40.
בדשבורד אמיתי זה אומר שדירוג לבדו לא מספיק כדי להחליט משהו.
עכשיו הוסיפו את [Avg Order Value]: המוביל עומד על
€4,991 להזמנה והאחרון על €4,310. ההבדל בסכום נובע בעיקר ממספר
ההזמנות (380 מול 288), לא מגודל הסל — ההבדל בין מדד מצטבר
למדד יחס.
המוביל: Kenji Smith — €1,896,727 (3.01%).
2.5 · גרף קו — מגמת מכירות
בנו Line chart עם Dim_Date[Full_Date] בציר X ו-[Total Sales] בציר Y. הרחיבו עד רמת Month.
מה רואים: שלוש שנים שטוחות כמעט לחלוטין — הפער בין השנה
החזקה לחלשה הוא פחות מ-2%. החודש החזק הוא 2025-07 עם
€2,114,749, והחלש 2024-01 עם €1,478,273.
שאלה לכיתה: האם התנודתיות החודשית היא עונתיות אמיתית או רעש?
עם 36 חודשים בלבד ופיזור כזה — התשובה היא רעש, וזה בדיוק מה שחשוב שתלמיד
ידע לומר במקום להמציא סיפור.
שיא: 2025-07 — €2,114,749.
2.6 · עמוד 2 וסלייסר השנה
פתחו עמוד שני בשם "זרקור נציגים ומוצרים" עם אותו רקע.
עמוד+ בתחתית ← שם: זרקור נציגים ומוצרים ← אותו רקע קנבס
סלייסרSlicer ← Dim_Date[Year] ← Style = Tile
עיצובמתחו לרוחב מתחת לכותרת · נבחר = כהה, לא-נבחר = בהיר
בדקו שהסלייסר משפיע על כל הוויזואלים, כולל אלה שבנויים על Fact_Returns ו-Fact_SalesTargets.
2.7 · טבלת הנציגים — כאן חיים IF ו-SWITCH
בנו Table עם Dim_SalesRep[SalesRep_Name] ושבעת המדדים: Rep Rank, Total Sales, % of All Sales, % of Leader, Running Sales, Rep Status ו-Rep Tier. מיון יורד, Totals = Off.
Dim_SalesRep[SalesRep_Name] · [Rep Rank] · [Total Sales]
[% of All Sales] · [% of Leader] · [Running Sales]
[Rep Status] · [Rep Tier]
ארבעה מובילים ושניים אחרונים
דירוג
נציג
מכירות
% מהכל
Status
Tier
1
Kenji Smith
€1,896,727
3.01%
מעל הממוצע
צמרת
2
Jan Ferrari
€1,817,937
2.89%
מעל הממוצע
צמרת
3
Anna Bernard
€1,814,008
2.88%
מעל הממוצע
צמרת
4
Sofia Muller
€1,777,435
2.82%
מעל הממוצע
צמרת
39
Olivia Tanaka
€1,310,164
2.08%
מתחת לממוצע
תחתית
40
Piotr Levi
€1,241,220
1.97%
מתחת לממוצע
תחתית
ההבדל בין שני המדדים:Rep Status משווה לממוצע
שמחושב מהדאטה (€1,573,244), ו-Rep Tier משווה לספים קבועים. נציג יכול
להיות "מתחת לממוצע" ועדיין בשכבת "אמצע".
למה Totals = Off: פונקציות חלון מחזירות ריק בשורת הסיכום.
20 "מעל הממוצע" · שכבות: 9 / 21 / 10.
2.8 · Top 10 מוצרים — Bar עם Top N
בנו Clustered bar chart עם Dim_Product[Product_Name] בציר Y ו-[Total Sales] בציר X, ופילטר Top N = 10 לפי המדד.
Y-axis = Dim_Product[Product_Name]
X-axis = [Total Sales]
Filter = Top N, 10, by [Total Sales]
עשרת המוצרים המובילים
#
מוצר
תת-קטגוריה
מכירות
1
Ardex Audio 1228
Audio
€583,483
2
Oryx Paper 1062
Paper
€527,442
3
Fernway Binder 1197
Binders
€514,267
4
Fernway Audio 1120
Audio
€502,029
5
Brightline Audio 1071
Audio
€501,447
6
Oryx Binder 1112
Binders
€477,644
7
Oryx Lighting 1026
Lighting
€471,020
8
Nexora Writing Tool 1098
Writing Tools
€470,305
9
Oryx Storage Unit 1269
Storage Units
€467,742
10
Volterra Laptop 1126
Laptops
€464,999
שימו לב לזנב הארוך: 300 מוצרים בקטלוג,
והמוביל מחזיק €583,483 — פחות מאחוז מסך המכירות. זה קטלוג מפוזר, לא קטלוג
שנשען על להיט אחד. גררו את Dim_ProductCategory[Category_Group] כדי לראות איפה
כן מתרכז הכסף.
המוביל: Ardex Audio 1228 — €583,483.
2.9 · Matrix — סגמנט לקוח × ערוץ
בנו Matrix עם Dim_Customer[Segment] בשורות, Dim_Channel[Channel_Name] בעמודות ו-[Total Sales] בערכים. Data bars = On.
שימו לב לנתיב הסינון: הסגמנט מגיע מ-Dim_Customer
והערוץ מ-Dim_Channel — שני מימדים נפרדים שמצטלבים על אותה טבלת עובדות.
זה בדיוק מה שסכמת כוכב נותנת בחינם.
סך כל התאים: €62,929,759 — זהה למדד הבסיס.
2.10 · גרף משולב — מכירות מול שולי רווח
בנו Line and clustered column chart עם Dim_ProductCategory[Category_Group] בציר X, [Total Sales] בעמודות ו-[Profit Margin %] בקו.
זו התובנה של כל הדשבורד: Technology מוכרת הכי הרבה
(43.6% מהמכירות) אבל דווקא Office Supplies, הקטנה מכולן
(19.8%), היא הרווחית ביותר — 41.5% שולי רווח מול
40.1%. עמודות ונפח מספרים סיפור אחד, הקו מספר אחר.
למה שני צירים: אחוז ויורו לא חולקים סקאלה. בגרף רגיל קו האחוזים
היה נמעך לאפס — זה בדיוק המקרה שבו הכלל "אל תשתמשו בשני צירים" לא חל.
הרווחית ביותר: Office Supplies — 41.5% שולי רווח.
2.11 · ניווט ופוליש
הוסיפו כפתורי ניווט בין שני העמודים והשלימו את הפוליש.
צבעו את טבלת הנציגים (תרגיל 2.7) בלי לכתוב אף חוק — הצבע מגיע מ-Tier Color.
Format visual <- Cell elements
Series: Rep Tier
Background color = On <- fx
Format style = Field value
What field should we base this on? = [Tier Color]
למה זה חזק יותר מ-Rules: החוקים בתרגיל 3.1 חיים בתוך ויזואל
אחד. המדד Tier Color הוא מקור אמת יחיד — שינוי אחד ב-SWITCH מתעדכן בכל מקום.
שתי הטכניקות מייצרות בדיוק את אותה חלוקה: 9 / 21 / 10.
סיכום — כל התוצאות במקום אחד
טבלת אימות מרוכזת לכל המדדים ולכל ויזואל. פתחו רק אחרי שסיימתם.
כל התוצאות המאומתות במקום אחד
מדד / רכיב
תוצאה מאומתת
Total Sales
€62,929,759
Gross לפני הנחה
€67,937,751 — הנחה €5,007,992
Total Orders
13,892 (COUNT היה מחזיר 30,000)
Avg Order Value
€4,530
Total Profit / Margin
€25,282,189 · 40.18%
Digital Sales
€25,531,540 (40.57%)
Promotion Sales
€26,793,724 (42.58%)
% of All Sales
מוביל 3.01% · Total 100.00%
Rep Status (IF)
20 מעל · 20 מתחת · ממוצע €1,573,244
Rep Tier (SWITCH)
9 צמרת · 21 אמצע · 10 תחתית
Rep Rank (RANK)
Kenji Smith = 1 · Piotr Levi = 40
Leader Sales (INDEX)
€1,896,727 · האחרון 65.4%
Running Sales (WINDOW)
שורה אחרונה = €62,929,759
Target Attainment %
99.86% (יעד €63,014,903)
Total Refunds
€2,364,425 (3.76%) ב-1,649 שורות
המוצר המוביל
Ardex Audio 1228 — €583,483
הקטגוריה הרווחית
Office Supplies — 41.5% שולי רווח
חודש השיא
2025-07 — €2,114,749
כל התוצאות אומתו ב-pandas מול Retail_StarSchema_PowerBI.xlsx
(30,000 שורות מכירה). 11 הקשרים נבדקו תכנותית — 0 מפתחות יתומים, 0 מפתחות ריקים,
0 תלויות מעגליות ו-0 נתיבי סינון כפולים.
אפשר לנווט גם בכפתורים שבראש המסך, בחצי המקלדת, ובטלפון בהחלקת אצבע