DAX Συναρτήσεις στο Power BI: Πώς να Υπολογίσετε Year-over-Year (YoY) Ανάπτυξη και Cumulative Sales
Ένας πλήρης τεχνικός οδηγός DAX για την υλοποίηση Time Intelligence στο Power BI. Δείτε πώς να υπολογίζετε Cumulative Sales, πωλήσεις προηγούμενου έτους και ποσοστό ετήσιας ανάπτυξης (YoY) για αξιόπιστο management reporting.
Η παρακολούθηση της επιχειρηματικής απόδοσης απαιτεί κάτι περισσότερο από στατικά αθροίσματα τζίρου. Ένα σύγχρονο dashboard διοικητικής πληροφόρησης (Management Reporting) οφείλει να απαντά άμεσα σε ερωτήματα όπως: «Πώς κινούμαστε σε σχέση με το αντίστοιχο διάστημα του προηγούμενου έτους;» και «Ποιος είναι ο σωρευτικός τζίρος από την αρχή του έτους μέχρι σήμερα (YTD);»
Στο οικοσύστημα της Microsoft, η γλώσσα DAX (Data Analysis Expressions) προσφέρει μια ισχυρή οικογένεια συναρτήσεων: το Time Intelligence. Σε αυτό το άρθρο, θα δούμε βήμα-προς-βήμα πώς να διαμορφώσετε σωστά το μοντέλο δεδομένων σας, πώς να κατασκευάσετε έναν άρτιο Πίνακα Ημερομηνιών (Date Table) και πώς να γράψετε αποδοτικά DAX measures για τον υπολογισμό Cumulative Sales (YTD) και Year-over-Year (YoY) μεταβολών.
1. Το Απαραίτητο Θεμέλιο: Ο Πίνακας Ημερομηνιών (Date Dimension)
Το πιο συχνό λάθος που οδηγεί σε εσφαλμένα αποτελέσματα στις συναρτήσεις Time Intelligence είναι η προσπάθεια εφαρμογής τους απευθείας πάνω στη στήλη ημερομηνίας του πίνακα συναλλαγών (Fact Table).
Για να λειτουργήσουν αξιόπιστα οι συναρτήσεις Time Intelligence, το μοντέλο σας πρέπει να διαθέτει έναν Dedicated Date Table που πληροί τις παρακάτω προϋποθέσεις:
- Περιέχει συνεχόμενες ημερομηνίες χωρίς κενά (no missing dates).
- Καλύπτει πλήρως το εύρος των ετών που υπάρχουν στα δεδομένα σας.
- Έχει μοναδικές τιμές ανά γραμμή.
- Έχει επισημανθεί ως Date Table στο Power BI Desktop (Mark as Date Table).
Δημιουργία Date Table με DAX
Μπορείτε να δημιουργήσετε έναν υπολογιζόμενο πίνακα ημερομηνιών μεταβαίνοντας στο Modeling > New Table και εισάγοντας τον παρακάτω κώδικα:
DimDate =
VAR MinYear = YEAR(MIN(FactSales[OrderDate]))
VAR MaxYear = YEAR(MAX(FactSales[OrderDate]))
RETURN
ADDCOLUMNS (
CALENDAR(DATE(MinYear, 1, 1), DATE(MaxYear, 12, 31)),
"Year", YEAR([Date]),
"MonthNumber", MONTH([Date]),
"MonthName", FORMAT([Date], "MMMM"),
"MonthYear", FORMAT([Date], "mmm yyyy"),
"Quarter", "Q" & FORMAT([Date], "Q"),
"YearMonthKey", YEAR([Date]) * 100 + MONTH([Date])
)
Σημείωση: Συνδέστε το πεδίο DimDate[Date] με το FactSales[OrderDate] με σχέση 1-προς-Πολλά (1:*).
Αν η βάση σας αντλείται από σχεσιακό σύστημα, είναι εξίσου καλή πρακτική να έχει προετοιμαστεί ο πίνακας ημερομηνιών σε επίπεδο βάσης. Οι γνώσεις που αποκτώνται στο σεμινάριο SQL & Database Fundamentals βοηθούν σημαντικά στη βελτιστοποίηση αυτών των δομών πριν φτάσουν στο Power BI.
2. Δημιουργία των Base Measures
Ποτέ μην εφαρμόζετε σύνθετους υπολογισμούς απευθείας σε στήλες (implicit measures). Δημιουργήστε πρώτα ένα καθαρό, βασικό measure για το άθροισμα των πωλήσεων:
Total Sales = SUM(FactSales[SalesAmount])
Αυτό το measure θα αποτελέσει το δομικό στοιχείο για όλους τους επόμενους υπολογισμούς Time Intelligence.
3. Υπολογισμός Cumulative Sales (Year-To-Date)
Ο υπολογισμός των σωρευτικών πωλήσεων από την 1η Ιανουαρίου του εκάστοτε έτους μέχρι την επιλεγμένη ημερομηνία μπορεί να υλοποιηθεί με δύο τρόπους.
Μέθοδος Α: Χρήση της TOTALYTD
Η συνάρτηση TOTALYTD αποτελεί συντομογραφία (syntactic sugar) της CALCULATE σε συνδυασμό με την DATESYTD:
Sales YTD =
TOTALYTD(
[Total Sales],
DimDate[Date]
)
Μέθοδος Β: Χρήση CALCULATE και DATESYTD (Προτεινόμενη)
Η σύνταξη με CALCULATE προσφέρει μεγαλύτερη ευελιξία όταν θέλετε να προσθέσετε επιπλέον φίλτρα (π.χ. φιλτράρισμα συγκεκριμένων κατηγοριών προϊόντων):
Sales YTD (Explicit) =
CALCULATE(
[Total Sales],
DATESYTD(DimDate[Date])
)
Αν η εταιρεία σας ακολουθεί οικονομικό έτος που δεν λήγει στις 31 Δεκεμβρίου (π.χ. λήξη 30 Ιουνίου), μπορείτε να ορίσετε την παράμετρο τέλους έτους:
Sales Fiscal YTD =
CALCULATE(
[Total Sales],
DATESYTD(DimDate[Date], "06-30")
)
4. Υπολογισμός Year-over-Year (YoY) Μεγεθών
Για να συγκρίνουμε την τρέχουσα απόδοση με την αντίστοιχη περσινή περίοδο, ακολουθούμε μια αλληλουχία τριών βημάτων: υπολογισμός περσινών πωλήσεων, απόλυτη διαφορά και ποσοστιαία μεταβολή.
Βήμα 1: Πωλήσεις Προηγούμενου Έτους (Sales Prior Year)
Χρησιμοποιούμε τη συνάρτηση SAMEPERIODLASTYEAR, η οποία μετατοπίζει αυτόματα το Filter Context κατά ακριβώς ένα έτος πίσω:
Sales Prior Year =
CALCULATE(
[Total Sales],
SAMEPERIODLASTYEAR(DimDate[Date])
)
(Εναλλακτικά, μπορεί να χρησιμοποιηθεί η DATEADD(DimDate[Date], -1, YEAR), η οποία παρέχει πανομοιότυπο αποτέλεσμα αλλά επιτρέπει και μετατοπίσεις μηνών ή ημερών).
Βήμα 2: Απόλυτη Μεταβολή (YoY Variance)
Η διαφορά σε απόλυτο χρηματικό ποσό υπολογίζεται με απλή αφαίρεση:
Sales YoY Variance =
[Total Sales] - [Sales Prior Year]
Βήμα 3: Ποσοστιαία Ανάπτυξη (YoY Growth %)
Για τον υπολογισμό του ποσοστού, αποφεύγουμε τη χρήση του συμβόλου της διαίρεσης (/) και επιλέγουμε πάντα τη συνάρτηση DIVIDE. Η DIVIDE χειρίζεται αυτόματα τις περιπτώσεις διαίρεσης με το μηδέν (Division by Zero) επιστρέφοντας BLANK() αντί για σφάλμα.
Sales YoY Growth % =
DIVIDE(
[Sales YoY Variance],
[Sales Prior Year],
BLANK()
)
Φορμάρετε το measure ως Percentage (%) με 1 ή 2 δεκαδικά ψηφία.
5. Προχωρημένος Υπολογισμός: Cumulative YoY Growth %
Για senior management reporting, συχνά απαιτείται η σύγκριση του φετινού YTD με το αντίστοιχο περσινό YTD. Η υλοποίηση γίνεται συνδυάζοντας τα προηγούμενα measures:
Sales YTD Prior Year =
CALCULATE(
[Sales YTD],
SAMEPERIODLASTYEAR(DimDate[Date])
)
Sales YTD YoY Growth % =
DIVIDE(
[Sales YTD] - [Sales YTD Prior Year],
[Sales YTD Prior Year],
BLANK()
)
Αυτή η τεχνική επιτρέπει στους αναλυτές να παρουσιάζουν δυναμικά γραφήματα γραμμής (Trend Charts) που δείχνουν αν η επιχείρηση επιταχύνει ή επιβραδύνει τον ρυθμό ανάπτυξής της κατά τη διάρκεια του έτους.
Συνοπτικός Πίνακας: Βασικές Συναρτήσεις Time Intelligence
| Συνάρτηση DAX | Περιγραφή | Τυπική Χρήση |
|---|---|---|
TOTALYTD |
Υπολογίζει το άθροισμα ενός measure από την αρχή του έτους | Μηνιαία / Ημερήσια Cumulative Reports |
DATESYTD |
Επιστρέφει πίνακα ημερομηνιών από 1/1 έως την τρέχουσα ημερομηνία | Συνδυασμός με CALCULATE για YTD |
SAMEPERIODLASTYEAR |
Μετατοπίζει το τρέχον σύνολο ημερομηνιών κατά 1 έτος πίσω | Ετήσιες συγκρίσεις (YoY Analysis) |
DATEADD |
Μετατοπίζει ημερομηνίες κατά N διαστήματα (Day, Month, Quarter, Year) | Υπολογισμοί MoM, QoQ, YoY |
PARALLELPERIOD |
Επιστρέφει ολόκληρη την παράλληλη περίοδο ανεξαρτήτως φίλτρου ημερών | Συγκρίσεις πλήρων ετών/τριμήνων |
Βήμα-προς-Βήμα Checklist Υλοποίησης σε Νέο Project
- Έλεγχος Μοντέλου: Επιβεβαιώστε ότι ο πίνακας γεγονότων (
FactSales) συνδέεται σωστά με τον πίνακα ημερομηνιών (DimDate). - Mark as Date Table: Κάντε δεξί κλικ στον
DimDateκαι επιλέξτε Mark as Date Table. - Δημιουργία Base Measure: Κατασκευάστε το
[Total Sales]. - Κατασκευή Time Measures: Γράψτε τα measures για
[Sales YTD],[Sales Prior Year]και[Sales YoY Growth %]. - Visual Validation: Τοποθετήστε τα πεδία σε ένα visual τύπου Matrix, με το
DimDate[Year]καιDimDate[MonthName]στις γραμμές, ώστε να ελέγξετε τη μαθηματική ορθότητα των υπολογισμών ανά μήνα και έτος.
Η κατανόηση του Evaluation Context (Filter & Row Context) στο Power BI είναι κρίσιμη δεξιότητα για κάθε σύγχρονο αναλυτή δεδομένων. Εάν επιθυμείτε να εμβαθύνετε σε προηγμένα data models και σύνθετη επιχειρηματική ανάλυση, το πρόγραμμα Power BI για Επαγγελματίες καθώς και η ολοκληρωμένη διαδρομή Business Analyst Path παρέχουν όλη την απαραίτητη πρακτική εξάσκηση πάνω σε πραγματικά εταιρικά σενάρια. Παράλληλα, για επαγγελματίες οικονομικής κατεύθυνσης, το σεμινάριο Financial Analysis & Budgeting συνδέει ιδανικά τις έννοιες αυτές με τις οικονομικές καταστάσεις και τον προϋπολογισμό.
Συχνές ερωτήσεις
Γιατί η SAMEPERIODLASTYEAR επιστρέφει κενές τιμές (BLANK);
Αυτό συμβαίνει συνήθως όταν ο πίνακας ημερομηνιών δεν έχει επισημανθεί ως 'Date Table', όταν υπάρχουν κενά (gaps) στο εύρος ημερομηνιών του DimDate, ή όταν για την επιλεγμένη περίοδο δεν υπάρχουν αντίστοιχες εγγραφές στο προηγούμενο έτος.
Ποια είναι η διαφορά μεταξύ SAMEPERIODLASTYEAR και DATEADD με παράμετρο -1 YEAR;
Στην πράξη, η SAMEPERIODLASTYEAR αποτελεί εξειδικευμένη παραλλαγή της DATEADD(DateColumn, -1, YEAR). Παράγουν το ίδιο ακριβώς αποτέλεσμα, αλλά η DATEADD είναι πιο ευέλικτη καθώς επιτρέπει μετατοπίσεις για μήνες, τρίμηνα ή προσαρμοσμένα έτη (π.χ. -2 έτη).
Γιατί πρέπει να χρησιμοποιώ τη συνάρτηση DIVIDE αντί για τον τελεστή διαίρεσης (/);
Η συνάρτηση DIVIDE περιλαμβάνει ενσωματωμένο έλεγχο για διαίρεση με το μηδέν (division by zero) ή με BLANK τιμές. Επιστρέφει BLANK ή μια προκαθορισμένη εναλλακτική τιμή, αποτρέποντας σφάλματα και 'Infinity' τιμές στα visual reports.
Μπορώ να χρησιμοποιήσω Time Intelligence σε λειτουργία DirectQuery;
Ναι, οι περισσότερες συναρτήσεις Time Intelligence λειτουργούν σε DirectQuery εφόσον υποστηρίζονται από την υποκείμενη βάση δεδομένων. Ωστόσο, για μέγιστη απόδοση και αποφυγή latency συνιστάται η χρήση Import Mode ή Composite Models για μεγάλα σύνολα δεδομένων.
Αναβαθμίστε τις αναλυτικές σας ικανότητες στο Power BI
Εξειδικευτείτε στη γλώσσα DAX, στο Data Modeling και στη δημιουργία διαδραστικών dashboards μέσα από πρακτικά workshops με καθοδήγηση από έμπειρους BI Consultants.
Δείτε το Σεμινάριο Power BIΣχετικά άρθρα
Από το Excel στο Power BI: Πώς να αυτοματοποιήσετε το Management Reporting
Πρακτικός οδηγός μετάβασης από τα στατικά spreadsheets σε σύγχρονα, αυτοματοποιημένα Power BI dashboards με διαδραστικούς δείκτες απόδοσης (KPIs) για τη διοίκηση.
Μοντελοποίηση Δεδομένων στο Power BI: Σχεδιασμός Star Schema και Βέλτιστες Πρακτικές Σχέσεων
Ένας πλήρης τεχνικός οδηγός για τη σωστή αρχιτεκτονική δεδομένων στο Power BI. Ανακαλύψτε γιατί το Star Schema υπερέχει, πώς να ρυθμίζετε σωστά τις σχέσεις και πώς να αποφεύγετε τα κρίσιμα λάθη απόδοσης.
Καθημερινό digest με νέα άρθρα και career insights
Ένα email τη μέρα με τα σημαντικότερα νέα άρθρα, οδηγούς και ευκαιρίες εκπαίδευσης.