שני עמודי דשבורד שכל מספר בהם מגיע ממדד שאתם כותבים מאפס, עם חיווי צבע אוטומטי למצב האזורים. עובדים על Telecom_PowerBI_Star.xlsx — סכמת כוכב טהורה: טבלת עובדות אחת, שבעה מימדים, 30,000 שורות ושבעה קשרים. 29 תרגילים, כל אחד בדף נפרד ועם פתרון מלא. שימו לב: ההורדה והתרגול הם במחשב בלבד — Power BI Desktop אינו קיים בטלפון.
הנתונים סינתטיים. שמות המדינות אמיתיים, אבל כל לקוח, חבילה, מכשיר, ערוץ ומספר בקובץ נוצרו באופן מלאכותי עם זרע אקראי קבוע 20260821. אין להסיק מהם דבר על שוק הטלקום האמיתי.
לפני שמתחילים — בניית המודל. הקובץ הוא סכמת כוכב טהורה: טבלת עובדות אחת Fact_Usage ושבעה מימדים, וכל מימד מתחבר ישירות אליה. אין קשר מימד-למימד ואין שרשור. סמנו את Dim_Date כטבלת תאריכים (Mark as date table על Full_Date), כבו Autodetect ובנו את שבעת הקשרים ידנית, כולם Single מהמימד אל העובדה. Both כאן מיותר לחלוטין.
המלכודת של הקובץ הזה — שורות עם מרווח שלילי בכוונה. בטבלת Fact_Usage יש 2,824 שורות (9.41%) שבהן Gross_Margin_USD שלילי — מכשירים מסובסדים וחבילות נדידה שנקנו בעלות סיטונאית גבוהה מהמחיר ללקוח. הן נושאות 241,146.59 USD הכנסה ומוחקות 50,484.13 USD מרווח. מדד מרווח כולל מקזז אותן בשקט ומראה 889,705.65 במקום 940,189.78. ההפסד לא נעלם — הוא רק מתחבא בסכימה. תרגיל 3.3 מפרק אותו.
עמודה שנראית אדיטיבית ואינה.Fact_Usage[Revenue_Per_GB] היא יחס, לא סכום. גרירה שלה עם Sum מחזירה 1,374,449.63 — מספר חסר כל משמעות. תרגיל 3.2 מסביר בדיוק למה, ומה כן עושים.
מילון סוגריים.Table[Column] = עמודה · [מדד] = סוגריים מרובעים בלי שם טבלה. לכל מדד: קליק ימני על Fact_Usage בחלונית Data ← New measure ← הנוסחה ← Enter. השם חייב להיות בדיוק כפי שמופיע בתרגיל.
מבנה המטלה
חלק 1
14 מדדי DAX
שני SUM, שני DISTINCTCOUNT, DIVIDE, שני CALCULATE, ALL, IF, שני SWITCH — ושלוש פונקציות חלון: RANK, INDEX ו-WINDOW.
חלק 2
אחד-עשר עמודי דשבורד
מגש KPI, דונאט מול עמודות, Small multiples, פיזור, מד מול יעד, Drill-through, Tooltip, Bookmark, Waterfall, Treemap וניווט.
חלק 3
צבע, מלכודת ותובנה
עיצוב מותנה בשתי טכניקות, שני תרגילי חשיבה על מספרים מטעים, ותובנת הסיום על רווחיות הערוצים.
שבעת הקשרים — בדיוק כפי שצריך לבנות אותם
שבעת הקשרים במודל
מימד
מפתח
קרדינליות
כיוון סינון
Dim_Date
Date_ID
1 : Many
Single
Dim_Customer
Customer_ID
1 : Many
Single
Dim_Plan
Plan_ID
1 : Many
Single
Dim_Region
Region_ID
1 : Many
Single
Dim_Device
Device_ID
1 : Many
Single
Dim_Channel
Channel_ID
1 : Many
Single
Dim_Service_Type
Service_Type_ID
1 : Many
Single
האזורים — לוח האימות לפרק I
הכנסה, שכבה ולקוחות לכל אזור
אזור
הכנסה USD
שכבה
לקוחות
שורות
North Metro
367,098.76
Top
1,087
4,277
South Metro
335,335.68
Top
1,070
3,772
Thames Corridor
282,052.63
Top
1,030
3,311
West Valley
268,760.12
Top
993
2,991
Rhine Belt
253,778.56
Top
994
2,989
East Coastal
250,554.98
Top
980
2,942
Pacific Rim
216,630.96
Mid
935
2,542
Northern Lakes
188,973.52
Mid
861
2,061
Iberian Coast
155,388.98
Mid
825
1,794
Central Plains
125,991.31
Low
783
1,560
Alpine South
81,044.73
Low
578
893
Highland West
68,643.62
Low
559
868
כל המספרים אומתו ב-pandas מול הקובץ
1.1 · Total Billed Revenue — מדד העוגן
צרו מדד בשם Total Billed Revenue שמסכם את Fact_Usage[Billed_Amount_USD]. עצבו עם מפריד אלפים ושתי ספרות אחרי הנקודה.
Total Billed Revenue =
SUM ( Fact_Usage[Billed_Amount_USD] )
יצירהקליק ימני על Fact_Usage ← New measure
עיצובFormat ← Currency ← שתי ספרות
בדיקהגררו לקארד ריק כדי לוודא שהמספר מופיע
למה זה מדד ולא עמודה: עמודה מחושבת הייתה נשמרת פעם אחת לכל שורה מתוך 30,000 ולא הייתה יודעת להגיב לסלייסר. מדד מחושב מחדש בכל תא של כל ויזואל, לפי בועת הסינון שהתא הזה מייצר. זה ההבדל היחיד שחשוב באמת.
תוצאה: 2,594,253.85 USD — מספר העוגן של כל המטלה.
1.2 · Total Gross Margin — ה-SUM השני
צרו מדד בשם Total Gross Margin שמסכם את Fact_Usage[Gross_Margin_USD]. שימו לב שזו עמודה אחרת מזו של תרגיל 1.1.
Total Gross Margin =
SUM ( Fact_Usage[Gross_Margin_USD] )
העמודה נגזרת, לא הומצאה:Gross_Margin_USD = Billed_Amount_USD - Service_Cost_USD בכל אחת מ-30,000 השורות. לכן 2,594,253.85 פחות 1,704,548.20 שווה בדיוק 889,705.65. אם אצלכם יוצא אחרת — הטעינה שברה משהו, לא המודל.
אזהרה מוקדמת: המרווח הכולל הזה כבר מקזז בתוכו 2,824 שורות הפסד. תרגיל 3.3 מפרק אותן.
תוצאה: 889,705.65 USD — 34.3% מההכנסה.
1.3 · Active Customers — כמה לקוחות באמת
צרו מדד בשם Active Customers שסופר לקוחות ייחודיים על בסיס Fact_Usage[Customer_ID].
Active Customers =
DISTINCTCOUNT ( Fact_Usage[Customer_ID] )
למה לא COUNT:COUNT(Customer_ID) היה מחזיר 30,000 — הוא סופר שורות שיש בהן ערך, לא ערכים ייחודיים. כל לקוח נושא 24.3 שורות שימוש בממוצע, ולכן 30,000 ÷ 1,236 ≈ 24.3.
תוצאה: 1,236 לקוחות פעילים.
1.4 · Devices In Use — ה-DISTINCTCOUNT השני
צרו מדד בשם Devices In Use שסופר דגמי מכשיר ייחודיים על בסיס Fact_Usage[Device_ID] — עמודה אחרת מזו של תרגיל 1.3. המדד משרת את ה-Treemap בתרגיל 2.10.
Devices In Use =
DISTINCTCOUNT ( Fact_Usage[Device_ID] )
שימו לב לרמת הפירוט: המדד סופר דגמים, לא יחידות פיזיות. Dim_Device מכילה 48 דגמים וכולם מופיעים בעובדות, ולכן ברמת הסך הכל המדד מחזיר בדיוק את מספר השורות במימד. ברגע שמסננים אזור או תקופה המספר יורד — וזה בדיוק מה שהופך אותו למדד שימושי.
תוצאה: 48 דגמי מכשיר.
1.5 · Revenue per Customer — עקרון הלגו
צרו מדד בשם Revenue per Customer — אך ורק משני המדדים הקיימים, בלי סימן החלוקה / ובלי AVERAGE. עצבו לשתי ספרות.
ממוצע של מה:AVERAGE(Billed_Amount_USD) היה מחזיר את הממוצע לשורת שימוש (86.48 USD), לא ללקוח. כשהמדד בנוי משני מדדים קיימים המכנה מוגדר במפורש ואתם יודעים בדיוק מה חילקתם. DIVIDE עדיף על / כי הוא מחזיר ריק במקום שגיאה כשהמכנה אפס.
המדד מתגלגל אוטומטית לכל הקשר: גררו אותו לטבלת האזורים והוא יחזיר את ה-ARPU של כל אזור בנפרד — בלי לכתוב שורה נוספת.
תוצאה: 2,098.91 USD ללקוח.
1.6 · Postpaid Revenue — CALCULATE ראשון
צרו מדד בשם Postpaid Revenue שמחזיר את ההכנסה מחבילות פוסטפייד בלבד. השתמשו ב-CALCULATE עם [Total Billed Revenue] כביטוי, ותנאי על Dim_Plan[Plan_Type].
מה קורה כאן: CALCULATE מוסיפה את התנאי לבועת הסינון ורק אז מריצה את [Total Billed Revenue]. הפילטר יושב על עמודת טקסט בטבלת המימד, זורם דרך הקשר Dim_Plan[Plan_ID] → Fact_Usage[Plan_ID] ומשם אל שורות העובדה — בלי שום JOIN.
הכנסה לפי סוג חבילה
סוג חבילה
הכנסה USD
אחוז
Postpaid
1,742,988.22
67.19%
Business
681,426.86
26.27%
Prepaid
169,838.77
6.55%
תוצאה: 1,742,988.22 USD — 67.19% מכלל ההכנסה.
1.7 · Core Services Revenue — CALCULATE עם IN
צרו מדד בשם Core Services Revenue שמחזיר את ההכנסה משלושה שירותי ליבה בלבד: Mobile Data, Fiber Broadband ו-IPTV. השתמשו באופרטור IN { } ולא בשלושה תנאי OR.
למה IN ולא OR: שלושה תנאי || על אותה עמודה עובדים, אבל הם מתרחבים לשלושה פילטרים נפרדים שהמנוע חייב לאחד. IN { } מייצר רשימת ערכים אחת — קצר יותר, מהיר יותר, וקל להוסיף לו ערך רביעי בלי לגעת בלוגיקה.
המלכודת בסוגריים המסולסלים:{ } ב-DAX הוא בנאי טבלה, לא רשימה. אם תכתבו שם ערך שלא קיים בעמודה — לא תקבלו שגיאה, פשוט תקבלו פחות הכנסה. בדקו את האיות מול Dim_Service_Type לפני שאתם מאשימים את המדד.
שלושת שירותי הליבה
שירות
הכנסה USD
Mobile Data
768,275.52
Fiber Broadband
437,010.40
IPTV
260,392.29
Core Services Revenue
1,465,678.21
תוצאה: 1,465,678.21 USD — 56.5% מכלל ההכנסה.
1.8 · Pct of All Usage — ALL ואחוז מכלל העובדות
צרו מדד בשם Pct of All Usage שמחזיר את חלקה של השורה הנוכחית מתוך כל ההכנסה בטבלת העובדות. הציגו אותו בטבלה לפי Dim_Service_Type[Service_Name] ובדקו שהעמודה מסתכמת ל-100%.
Pct of All Usage =
DIVIDE (
[Total Billed Revenue],
CALCULATE (
[Total Billed Revenue],
ALL ( Fact_Usage ),
ALL ( Dim_Service_Type )
)
)
למה שני ALL ולא אחד — זו הנקודה של התרגיל:ALL ( Fact_Usage ) מנקה פילטרים שיושבים על עמודות טבלת העובדות. הוא לא מנקה פילטר שהגיע מ-Dim_Service_Type וזרם פנימה דרך הקשר. אם תשאירו רק את ה-ALL הראשון, המונה והמכנה יהיו זהים בכל שורה והמדד יחזיר 100.00% בכל שורה — וזו הטעות הנפוצה ביותר במדד הזה.
בדיקת שפיות מיידית: אם סכום העמודה בטבלה אינו בדיוק 100.00% — המכנה לא באמת השתחרר. זו הבדיקה היחידה שצריך.
אחוז ההכנסה לכל שירות
שירות
הכנסה USD
אחוז מהכל
Mobile Data
768,275.52
29.61%
Roaming Package
513,156.72
19.78%
Fiber Broadband
437,010.40
16.85%
IPTV
260,392.29
10.04%
Device Instalment
228,696.21
8.82%
Cloud Storage
149,152.69
5.75%
Voice Domestic
125,399.74
4.83%
SMS Messaging
58,374.38
2.25%
Voice International
53,795.90
2.07%
Total
2,594,253.85
100.00%
תוצאה: המוביל Mobile Data עם 29.61%; העמודה מסתכמת ל-100.00%.
1.9 · Margin Status — IF מול נקודת איזון מחושבת
צרו מדד טקסט בשם Margin Status שמשווה את ההכנסה לנקודת האיזון — כלומר לעלות השירות באותו הקשר — ומחזיר Above Break-Even או Below Break-Even. נקודת האיזון חייבת להיות מחושבת בתוך המדד, לא מספר קשיח.
Margin Status =
VAR BreakEven =
SUM ( Fact_Usage[Service_Cost_USD] )
VAR Revenue = [Total Billed Revenue]
RETURN
IF (
Revenue >= BreakEven,
"Above Break-Even",
"Below Break-Even"
)
למה VAR ולא לכתוב את הסכום פעמיים: VAR מחושב פעם אחת לכל תא ואז נעשה בו שימוש חוזר. זה גם מהיר יותר וגם מונע את הטעות הקלאסית שבה מישהו משנה את הנוסחה במקום אחד ושוכח את השני.
נקודת האיזון זזה עם ההקשר: ברמת הסך הכל היא 1,704,548.20 USD, ובכל שורת שירות היא העלות של אותו שירות בלבד. זה בדיוק ההבדל בין מדד לבין מספר קשיח — מספר קשיח היה מסמן הכול כרווחי או הכול כהפסדי.
נקודת איזון לכל שירות
שירות
הכנסה USD
עלות USD
Margin Status
Mobile Data
768,275.52
414,499.34
Above Break-Even
Roaming Package
513,156.72
411,929.20
Above Break-Even
Fiber Broadband
437,010.40
233,766.61
Above Break-Even
IPTV
260,392.29
186,268.21
Above Break-Even
Device Instalment
228,696.21
264,819.00
Below Break-Even
Cloud Storage
149,152.69
68,839.97
Above Break-Even
Voice Domestic
125,399.74
60,184.93
Above Break-Even
SMS Messaging
58,374.38
25,012.54
Above Break-Even
Voice International
53,795.90
39,228.40
Above Break-Even
תוצאה: 8 שירותים מעל נקודת האיזון ו-1 מתחתיה (Device Instalment). ברמת הערוצים: 8 מעל, 0 מתחת.
1.10 · Region Tier — SWITCH ( TRUE ( ) )
צרו מדד בשם Region Tier שמחלק אזורים לשלוש שכבות לפי ההכנסה: Top מ-250,000 USD ומעלה, Mid מ-150,000 ומעלה, וכל השאר Low. השתמשו ב-SWITCH ( TRUE ( ) ) ולא ב-IF מקונן.
למה SWITCH ( TRUE ( ) ): הוא קורא את התנאים מלמעלה למטה ועוצר בראשון שמתקיים, בדיוק כמו IF מקונן — אבל בלי קינון. הוספת שכבה רביעית היא שורה אחת, ולא ניתוח מחדש של סוגריים.
הסדר הוא הלוגיקה: אם תהפכו את שתי השורות ותשימו 150000 ראשון, כל אזור מעל 250,000 יקבל Mid — כי הוא עונה גם על התנאי הרופף יותר. אין שגיאה, יש רק תוצאה שקטה ושגויה.
שכבת ההכנסה לכל אזור
אזור
הכנסה USD
שכבה
North Metro
367,098.76
Top
South Metro
335,335.68
Top
Thames Corridor
282,052.63
Top
West Valley
268,760.12
Top
Rhine Belt
253,778.56
Top
East Coastal
250,554.98
Top
Pacific Rim
216,630.96
Mid
Northern Lakes
188,973.52
Mid
Iberian Coast
155,388.98
Mid
Central Plains
125,991.31
Low
Alpine South
81,044.73
Low
Highland West
68,643.62
Low
תוצאה: 6 אזורים Top · 3Mid · 3Low.
1.11 · Tier Color — SWITCH על ערך
צרו מדד בשם Tier Color שמקבל את התוצאה של [Region Tier] ומחזיר קוד הקסה: Top ← #132449, Mid ← #F5C518, כל השאר ← #A9B4CC. זהו SWITCH על ערך, לא על TRUE ( ).
שתי צורות של אותה פונקציה: ב-1.10 הארגומנט הראשון היה TRUE () וכל זוג היה תנאי-ותוצאה. כאן הארגומנט הראשון הוא ביטוי, וכל זוג הוא ערך-ותוצאה — השוואת שוויון פשוטה. הארגומנט האחרון בלי בן זוג הוא תמיד ברירת המחדל.
המדד הזה לא מיועד לעין: הוא מיועד ל-Conditional formatting ← Field value. גררו אותו לטבלה כדי לוודא שהוא מחזיר מחרוזות תקינות, ואז הסתירו את העמודה. תרגיל 3.1 מחבר אותו בפועל.
צרו מדד בשם Region Rank by Customers שמדרג אזורים לפי מספר הלקוחות (לא לפי הכנסה), מהגבוה לנמוך, בדירוג צפוף. השתמשו ב-RANK עם ORDERBY.
Region Rank by Customers =
RANK (
DENSE,
ALLSELECTED ( Dim_Region ),
ORDERBY ( [Active Customers], DESC )
)
שלושת החלקים של RANK:DENSE קובע שאין קפיצות במספור, ALLSELECTED ( Dim_Region ) מגדיר את קבוצת ההשוואה — כל האזורים שהסלייסר השאיר על המסך — ו-ORDERBY קובע לפי מה ממיינים. בלי הארגומנט השני כל שורה תדרג את עצמה מול עצמה ותקבל 1.
למה ALLSELECTED ולא ALL:ALL היה מתעלם גם מהסלייסר, וכך אזור שסוננה החוצה עדיין היה תופס מקום בדירוג. ALLSELECTED מדרג בתוך מה שהמשתמש באמת רואה — וזה כמעט תמיד מה שרוצים בדשבורד.
דירוג לפי מספר לקוחות
אזור
לקוחות
דירוג
North Metro
1,087
1
South Metro
1,070
2
Thames Corridor
1,030
3
Rhine Belt
994
4
West Valley
993
5
East Coastal
980
6
Pacific Rim
935
7
Northern Lakes
861
8
Iberian Coast
825
9
Central Plains
783
10
Alpine South
578
11
Highland West
559
12
תוצאה: North Metro במקום 1 עם 1,087 לקוחות · Highland West במקום 12 עם 559.
1.13 · Top Margin Channel Rev — INDEX
צרו מדד בשם Top Margin Channel Rev שמחזיר את ההכנסה של הערוץ עם המרווח הגבוה ביותר — אותו מספר בכל שורה של הטבלה, כדי שאפשר יהיה להשוות אליו. השתמשו ב-INDEX עם ORDERBY.
INDEX מחזיר שורה, לא מספר:INDEX ( 1, ... ) בוחר את השורה הראשונה במיון שהגדרתם ומחזיר טבלה בת שורה אחת. כדי לקבל ממנה מספר צריך להזין אותה כפילטר ל-CALCULATE — וזו הסיבה שהמדד בנוי בשני שלבים.
המיון הוא לפי מרווח, הפלט הוא הכנסה: וזו בדיוק הנקודה. הערוץ שמוביל במרווח הוא Web Self Service עם 203,233.89 USD מרווח, ואילו הערוץ שמוביל בהכנסה הוא Authorised Dealer עם 518,340.19 USD. שני מובילים שונים — תרגיל 3.4 חוזר לזה.
הכנסה ומרווח לכל ערוץ
ערוץ
הכנסה USD
מרווח USD
שיעור מרווח
Web Self Service
409,216.29
203,233.89
49.66%
Mobile App
369,873.34
179,382.20
48.5%
Authorised Dealer
518,340.19
136,924.32
26.42%
Own Retail Store
353,217.67
130,295.07
36.89%
Inbound Call Center
240,639.08
95,938.14
39.87%
Retail Chain
289,874.03
65,925.50
22.74%
Online Marketplace
256,111.85
54,088.01
21.12%
Field Sales Agency
156,981.40
23,918.52
15.24%
תוצאה: 409,216.29 USD בכל שורה — ההכנסה של Web Self Service.
1.14 · Trailing Avg Excl Current — WINDOW
צרו מדד בשם Trailing Avg Excl Current שמחזיר את ממוצע ההכנסה של שלושת החודשים שקדמו לחודש הנוכחי — בלי לכלול את החודש הנוכחי עצמו. השתמשו ב-WINDOW עם ORDERBY על Dim_Date[Month_Key].
קריאת הגבולות:-3, REL הוא שלוש שורות אחורה מהשורה הנוכחית, -1, REL הוא שורה אחת אחורה. החלון נעצר לפני החודש הנוכחי, ולכן הממוצע לא כולל אותו. אם תכתבו 0, REL בגבול העליון — קיבלתם ממוצע נע רגיל של ארבעה חודשים, וזה תרגיל אחר.
למה Month_Key ולא Month_Label: WINDOW ממיין את השורות לפי העמודה שנתתם ל-ORDERBY, וזו חייבת להיות אותה עמודה שמופיעה על ציר הוויזואל. Month_Key הוא מספר (202401) ולכן ממיין נכון גם בין שנים. שימו אותו על הציר.
החודש הראשון מחזיר ריק: אין לפניו שורות, והחלון ריק. זה נכון ולא באג — אל תעטפו ב-COALESCE רק כדי לראות אפס.
בנו את עמוד הדשבורד הראשון: רקע כהה, כותרת עליונה, ומגש עם ארבעה קארדים שמציגים את [Total Billed Revenue], [Total Gross Margin], [Active Customers] ו-[Revenue per Customer].
גודל הדףFormat page ← Canvas settings ← 16:9 ← 1280x720
רקעCanvas background ← צבע #132449 ← שקיפות 0%
כותרתText box ברוחב מלא בראש הדף — Telecom Performance, גופן 28, לבן
מגשמלבן אחד ברוחב 1240 וגובה 130 מתחת לכותרת, מילוי #1B2E5A, פינות מעוגלות 8
ארבעה קארדיםCard ← מדד אחד לכל קארד ← סדרו אותם בתוך המגש עם רווח שווה
יישורבחרו את ארבעתם ← Format ← Align top ← Distribute horizontally
קטגוריהבכל קארד: Category label דלוק, גופן 11, צבע #A9B4CC
ארבעה קארדים: 2,594,253.85 · 889,705.65 · 1,236 · 2,098.91.
2.2 · דונאט מול עמודות — אותו נתון, שתי צורות
בנו שני ויזואלים זה לצד זה על אותו נתון בדיוק: [Total Billed Revenue] לפי Dim_Service_Type[Service_Name] — פעם כדונאט ופעם כעמודות מדורגות. כתבו בתיבת טקסט מתחתם משפט אחד שמסביר איזה מהם עונה מהר יותר על השאלה ״מי השני״.
תוויותDetail labels ← Label style = Category, percent of total
עמודותClustered bar chart ← Y axis = Service_Name ← X axis = אותו מדד
מיוןבגרף העמודות: שלוש נקודות ← Sort axis ← המדד ← Descending
צבע אחידשני הוויזואלים עם אותה פלטה, כדי שההשוואה תהיה על הצורה ולא על הצבע
המסקנהבדונאט צריך להשוות זוויות; בעמודות התשובה היא השורה השנייה מלמעלה
חמשת השירותים המובילים
שירות
הכנסה USD
אחוז
Mobile Data
768,275.52
29.61%
Roaming Package
513,156.72
19.78%
Fiber Broadband
437,010.40
16.85%
IPTV
260,392.29
10.04%
Device Instalment
228,696.21
8.82%
המוביל Mobile Data עם 29.61%; השני Roaming Package עם 19.78%.
2.3 · Small multiples — אזור אחר בכל תא
בנו גרף עמודות של [Total Billed Revenue] לפי Dim_Date[Month_Key], ופצלו אותו ל-Small multiples לפי Dim_Region[Market_Cluster]. שלושה תאים, אחד לכל אשכול שוק.
גרף בסיסClustered column chart ← X axis = Month_Key ← Y axis = [Total Billed Revenue]
פיצולגררו את Market_Cluster אל השדה Small multiples
ציר משותףY axis ← Shared axis דלוק — בלי זה ההשוואה בין התאים חסרת ערך
כותרותHeader ← גופן 12 ← צבע #F5C518
שלושה תאים: Urban Core, Suburban, Rural — עם ציר Y משותף.
2.4 · פיזור — הכנסה מול מרווח לכל ערוץ
בנו גרף פיזור שבו כל נקודה היא ערוץ: ציר X = [Total Billed Revenue], ציר Y = [Total Gross Margin], גודל = [Active Customers]. הוסיפו קו מגמה וסמנו את החריג.
החריגהנקודה שהכי רחוקה מתחת לקו היא הערוץ שמייצר הכנסה יקרה מדי
החריג: Authorised Dealer — 518,340.19 USD הכנסה אך רק 26.42% מרווח.
2.5 · מד מול יעד — Gauge על המרווח
בנו Gauge שמציג את [Total Gross Margin] מול יעד שנתי של 900,000.00 USD. הגדירו מינימום 0, מקסימום 1,200,000.00 ויעד קבוע.
ויזואלGauge ← Value = [Total Gross Margin]
גבולותFormat ← Gauge axis ← Min = 0 ← Max = 1200000
יעדTarget value = 900000 — ידני, כי אין טבלת יעדים בקובץ
צבעמילוי #F5C518 ← קו היעד #A9B4CC
תוויתCallout value דלוק, שתי ספרות אחרי הנקודה
המרווח 889,705.65 USD מול יעד 900,000.00 — פער של -10,294.35 USD (98.9% מהיעד).
2.6 · Drill-through — מערוץ אל פירוט השירותים
בנו עמוד שלישי בשם Channel Detail שמוגדר כיעד Drill-through לפי Dim_Channel[Channel_Name]. בעמוד היעד: כרטיס עם שם הערוץ, טבלת שירותים וגרף חודשי — כולם מסוננים אוטומטית לערוץ שממנו הגיעו.
עמוד יעדצרו עמוד חדש ← Format page ← Page information ← Allow use as drill-through
שדה הצלילהגררו את Channel_Name אל Add drill-through fields here
כרטיס כותרתCard עם Channel_Name — כדי שיהיה ברור לאן צללתם
שני עמודים + עמוד Drill-through + עמוד Tooltip, סלייסר מסונכרן וניווט עובד. כל מספר על המסך מגיע מאחד מ-14 המדדים.
3.1 · אותה חלוקה, שתי טכניקות צביעה
צבעו את טבלת האזורים לפי השכבה — פעם עם Rules בתוך הוויזואל, ופעם עם המדד [Tier Color] דרך Field value. השוו בין השתיים וכתבו משפט אחד על מתי כל אחת עדיפה.
טכניקה באותו מסך ← Format style = Field value ← [Tier Color]
הבדיקהשתי הטכניקות חייבות לתת בדיוק את אותה תמונה — 6 כהים, 3 צהובים, 3 אפורים
ההבדלRules חי בתוך הוויזואל; המדד חי במודל ומשרת כל ויזואל בקובץ
מתי כל אחת:Rules מהיר לוויזואל בודד ולא דורש מדד. Field value הוא היחיד שמבטיח שכל ויזואל בדוח מספר את אותו סיפור צבע — וכשמישהו ישנה את הסף מ-250,000 ל-260,000, זו שורה אחת במדד במקום עריכה של כל ויזואל בנפרד.
שתי הטכניקות: 6 תאים #132449 · 3#F5C518 · 3#A9B4CC.
3.2 · למה התשובה הנאיבית שגויה — ולא לכתוב מדד
התרגיל הזה לא מבקש מדד. מנהל שואל ״כמה אנחנו גובים בממוצע לג״ב?״. אנליסט גורר את Fact_Usage[Revenue_Per_GB] לקארד, בוחר Average ומקבל 45.8150 USD. התשובה הנכונה היא 1.2057 USD — פי 38.0 פחות. כתבו בשתי-שלוש שורות למה הנאיבי שגוי, ומה עושים במקום.
התשובה: ממוצע של יחסים אינו היחס של הסכומים.Revenue_Per_GB מחושבת לכל שורה בנפרד — Billed_Amount_USD / Data_Volume_GB — ולכן שורה שצרכה 0.03 ג״ב ושילמה 6.00 USD תורמת יחס של 200 בדיוק כמו שורה שצרכה 400 ג״ב. AVERAGE נותן לשתיהן משקל זהה, והשורות הקטנות — שהן הרוב — מושכות את התוצאה למעלה.
מה עושים במקום: מחשבים את היחס פעם אחת ברמת האגרגט, לא ממצעים יחסים:
True Revenue per GB =
DIVIDE (
[Total Billed Revenue],
SUM ( Fact_Usage[Data_Volume_GB] )
)
ולמה בכלל אסור לסכם את העמודה:SUM(Revenue_Per_GB) מחזיר 1,374,449.63 — מספר שאין לו יחידת מידה ואין לו משמעות. כל עמודה שכבר עברה חלוקה אינה אדיטיבית, ולכן היא צריכה להיות מוסתרת במודל (Hide in report view) כדי שאף אחד לא יגרור אותה בטעות.
מה המספרים אומרים:2,824 שורות מתוך 30,000 (9.41%) נושאות מרווח שלילי. הן מייצרות 241,146.59 USD הכנסה — ומוחקות 50,484.13 USD מרווח. בלעדיהן המרווח היה 940,189.78 במקום 889,705.65.
למה זה חשוב דווקא כאן:9.41% מהשורות נראה זניח, אבל הן מרוכזות בשירות אחד — Device Instalment — שכולו יורד מתחת לנקודת האיזון. סכימה על פני כל הקובץ מחביאה את זה לחלוטין; רק פילוח לפי שירות חושף אותו. זו בדיוק הסיבה שתרגיל 2.9 בנוי כ-Waterfall ולא כעמודות.
פירוק המרווח לשני חלקים
חלק
שורות
הכנסה USD
מרווח USD
שורות רווחיות
27,176
2,353,107.26
940,189.78
שורות הפסד
2,824
241,146.59
-50,484.13
סך הכל
30,000
2,594,253.85
889,705.65
הקיזוז: 940,189.78 מינוס 50,484.13 שווה 889,705.65 USD.
3.4 · תובנת הסיום — הערוץ שמוכר הכי הרבה אינו הרווחי
השאלה הסוגרת: איזה ערוץ באמת מרוויח לנו כסף? בנו טבלה אחת עם ארבע עמודות — ערוץ, הכנסה, מרווח ושיעור מרווח — מיינו לפי הכנסה, ואז מיינו שוב לפי מרווח. כתבו שלוש שורות: מה ראיתם, מה זה אומר, ומה הייתם ממליצים.
שיעור מרווחמדד עזר: DIVIDE ( [Total Gross Margin], [Total Billed Revenue] ) בפורמט אחוז
מיון ראשוןלפי הכנסה יורד — ורשמו מי בראש
מיון שנילפי מרווח יורד — ורשמו מי בראש עכשיו
השוואההוסיפו את [Top Margin Channel Rev] מתרגיל 1.13 כעמודת ייחוס
מה רואים:Authorised Dealer מוביל בהכנסה עם 518,340.19 USD — אבל שיעור המרווח שלו הוא רק 26.42%, והמרווח בפועל 136,924.32 USD. לעומתו Web Self Service מייצר פחות הכנסה (409,216.29) אבל יותר מרווח — 203,233.89 USD בשיעור 49.66%.
מה זה אומר: הפער אינו במחיר שהלקוח משלם — הוא בעלות הרכישה. הערוצים הדיגיטליים הישירים לא משלמים עמלה, והערוצים השותפים כן. לכן Field Sales Agency מסיים עם 15.24% בלבד. דירוג ערוצים לפי הכנסה הוא דירוג של מחזור, לא של תרומה.
מה ממליצים: לא לסגור את ערוץ השותפים — הוא עדיין מייצר 280,856.35 USD מרווח חיובי. ההמלצה היא להזיז לקוחות קיימים לחידוש דיגיטלי ולשמור את השותפים לגיוס חדש בלבד. וכל מדד יעד לערוץ צריך להיות על מרווח, לא על מחזור.
ערוצים ישירים מול שותפים
קבוצת ערוץ
הכנסה USD
מרווח USD
שיעור מרווח
Direct
1,372,946.38
608,849.30
44.35%
Partner
1,221,307.47
280,856.35
23.0%
כל שמונת הערוצים לפי מרווח
ערוץ
הכנסה USD
מרווח USD
שיעור מרווח
Web Self Service
409,216.29
203,233.89
49.66%
Mobile App
369,873.34
179,382.20
48.5%
Authorised Dealer
518,340.19
136,924.32
26.42%
Own Retail Store
353,217.67
130,295.07
36.89%
Inbound Call Center
240,639.08
95,938.14
39.87%
Retail Chain
289,874.03
65,925.50
22.74%
Online Marketplace
256,111.85
54,088.01
21.12%
Field Sales Agency
156,981.40
23,918.52
15.24%
המוביל בהכנסה Authorised Dealer; המוביל במרווח Web Self Service. פער שיעורי מרווח: 49.66% מול 15.24%.
סיכום — כל התוצאות במקום אחד
טבלת אימות מרוכזת לכל 14 המדדים ולכל מספר במטלה. פתחו אותה רק אחרי שסיימתם — היא נותנת את כל התשובות.
כל התוצאות המאומתות במקום אחד
מדד / רכיב
תוצאה מאומתת
Total Billed Revenue
2,594,253.85 USD
Total Gross Margin
889,705.65 USD (34.3%)
Active Customers
1,236 (COUNT היה מחזיר 30,000)
Devices In Use
48
Revenue per Customer
2,098.91 USD
Postpaid Revenue
1,742,988.22 USD (67.19%)
Core Services Revenue
1,465,678.21 USD (56.5%)
Pct of All Usage
מוביל 29.61% · Total 100.00%
Margin Status
8 מעל · 1 מתחת · נקודת איזון 1,704,548.20
Region Tier
6 Top · 3 Mid · 3 Low
Tier Color
#132449 · #F5C518 · #A9B4CC
Region Rank by Customers
North Metro = 1 · Highland West = 12
Top Margin Channel Rev
409,216.29 בכל שורה (Web Self Service)
Trailing Avg Excl Current
2025-12 = 98,001.45 · 2024-01 = BLANK
True Revenue per GB
1.2057 USD לג״ב
הערוץ המוביל בהכנסה
Authorised Dealer — 518,340.19 USD
הערוץ המוביל במרווח
Web Self Service — 203,233.89 USD
האזור המוביל
North Metro — 367,098.76 USD
חודש השיא
2025-08 — 160,572.15 USD
החודש החלש
2024-02 — 72,960.34 USD
השירות המפסיד
Device Instalment — -36,122.79 USD
שורות מרווח שלילי
2,824 (9.41%)
כל התוצאות אומתו ב-pandas מול Telecom_PowerBI_Star.xlsx (30,000 שורות עובדה), וכל שבעת הקשרים נבדקו תכנותית — 0 מפתחות יתומים, 0 מפתחות ריקים, 0 תלויות מעגליות ו-0 נתיבי סינון כפולים.
אפשר לנווט גם בכפתורים שבראש המסך, בחצי המקלדת, ובטלפון בהחלקת אצבע