taazz Δημοσ. 7 Δεκεμβρίου 2011 Δημοσ. 7 Δεκεμβρίου 2011 Δεν θα παίξει σωστά. Αυτο θα σου γυρίσει ανα city το brand με το μεγαλύτερο ποσό ημέρας και όχι όλου του χρονου. Δεν νομίζω, δεν υπάρχει κανένα πεδίο από τον πίνακα time στο group by στο αποτέλεσμα θα λυφθούν υπ'όψιν όλη η βάση χωρίς κανένα χρονικό περιορισμό. Πρέπει πρώτα να αθροίσεις και μετά να βρεις το μέγιστο του αθροίσματος. Θέλεις max στο sum ή analytical function κατάταξης βάσει του ποσού. μόνο ένα order by στο sum θέλει για να έρθουν τα μεγαλήτερα πάνω όχι max.
fonsde Δημοσ. 7 Δεκεμβρίου 2011 Μέλος Δημοσ. 7 Δεκεμβρίου 2011 δεν μπορω να δω αν παιζει απλα μας ζητανε 2 query στον αερα λεει find the most profitable (hint: max(money_sold)) brands aggregated by city in 2009 οπου το money sold ειναι το money μιας πωλησης
Aztec Δημοσ. 7 Δεκεμβρίου 2011 Δημοσ. 7 Δεκεμβρίου 2011 Δεν νομίζω, δεν υπάρχει κανένα πεδίο από τον πίνακα time στο group by στο αποτέλεσμα θα λυφθούν υπ'όψιν όλη η βάση χωρίς κανένα χρονικό περιορισμό. μόνο ένα order by στο sum θέλει για να έρθουν τα μεγαλήτερα πάνω όχι max. taazz κάνεις λάθος . Εκτός και αν σήμερα κάνουν πουλάκια τα μάτια μου. Είναι πιθάνο ... Λοιπόν ο sales πίνακας χωρίς τα joins Μπορεί να ήταν ως εξής day city brand money_sold 1 1 1 200 1 1 1 200 1 1 1 300 2 1 1 400 2 1 1 500 2 1 1 600 2 1 1 700 Μία πόλη και ένα brand δηλαδή Τι θα σου φέρει το select city,brand,max(money_sold)from sales group by city,brand; Δεν θα σου φέρει το μεγαλύτερο ποσό μιας ημέρας από όλες τις ημέρες ? Άρα 1 ,1 , 700 ? Άσχετο η λέξη πώληση που κολλάει? Το datawarehouse έχει time granularity ημερήσιο και κρατάει ήδη summaries . Κάτι μου λέει ότι μ434343μαστε
taazz Δημοσ. 7 Δεκεμβρίου 2011 Δημοσ. 7 Δεκεμβρίου 2011 δεν μπορω να δω αν παιζει απλα μας ζητανε 2 query στον αερα λεει find the most profitable (hint: max(money_sold)) brands aggregated by city in 2009 οπου το money sold ειναι το money μιας πωλησης Σε αυτή την περίπτωση το query που έγραψες είναι σωστό απλά πρόσθεσε στο τέλος order by 3 όπου 3 είναι το index του πεδίου στο select.
Aztec Δημοσ. 7 Δεκεμβρίου 2011 Δημοσ. 7 Δεκεμβρίου 2011 Σε αυτή την περίπτωση το query που έγραψες είναι σωστό απλά πρόσθεσε στο τέλος order by 3 όπου 3 είναι το index του πεδίου στο select. Θέλει να βρει το most profitable που σημαίνει ότι δεν θέλει να γυρίσει ανα city όλα τα brands σορταρισμένα (city , brand desc) αλλα αυτό select brand,city,MAX(SUMAMNT) from (SELECT Brand.brand, Location.city, SUM(Sales.money_sold) SUMAMNT FROM Time, Location, Sales, Item, Brand WHERE Sales.time_key = Time.time_key AND Time.year = 2009 AND Sales.item_key = Item.item_key AND Item.brand_key = Brand.brand_key AND Sales.location_key = Location.location_key GROUP BY Location.city, Brand.brand ) group by brand , city To query που έχει δώσει θα επιστρέψει ανα πόλη το brand με τις μεγαλύτερες πωλήσεις μιας ημέρας του χρόνου.
taazz Δημοσ. 7 Δεκεμβρίου 2011 Δημοσ. 7 Δεκεμβρίου 2011 taazz κάνεις λάθος . Εκτός και αν σήμερα κάνουν πουλάκια τα μάτια μου. Είναι πιθάνο ... Λοιπόν ο sales πίνακας χωρίς τα joins Μπορεί να ήταν ως εξής > day city brand money_sold 1 1 1 200 1 1 1 200 1 1 1 300 2 1 1 400 2 1 1 500 2 1 1 600 2 1 1 700 Μία πόλη και ένα brand δηλαδή Τι θα σου φέρει το > select city,brand,max(money_sold) from sales group by city,brand; Δεν θα σου φέρει το μεγαλύτερο ποσό μιας ημέρας από όλες τις ημέρες? Άρα 1 ,1 , 700 ? Nαι το παραπάνω SQL θα σου επιστρέψη την τελευταια γραμμή δηλαδη 2, 1, 1, 700 αλλά αυτό δεν είναι το μεγαλήτερο ποσό ημέρας αλλά χρονικής περιόδου που ορίζεται με το where Τime.year = 2009 άρα το υψηλότερο ποσό έτους στο sql του T/S και του διημέρου στο δικό σου παράδειγμα. Άσχετο η λέξη πώληση που κολλάει? Το datawarehouse έχει time granularity ημερήσιο και κρατάει ήδη summaries. Είναι πωλήσεις διαφορετικά ο πίνακας δεν θα λεγότανε sales αλλά κάπως αλλιώς. Με την λέξη πώληση εννοώ μια εγγραφή στον πίνακα αυτό εάν σας μπέρδεψα γράψε λάθος και διάβασε εγγραφή στον πίνακα sales. Κάτι μου λέει ότι μ434343μαστε Δεν με αφορά τι κάνετε κρατήστε το για τον εαυτό σας αν είναι δυνατόν.
Aztec Δημοσ. 7 Δεκεμβρίου 2011 Δημοσ. 7 Δεκεμβρίου 2011 Κάνεις λάθος . Αυτό τι θα σου γυρίσει > year day city brand money_sold 2009 1 1 1 200 2009 2 1 1 200 2009 3 1 1 300 2009 4 1 1 400 2009 5 1 1 500 2009 6 1 1 600 2009 7 1 1 700 >select city,brand,max(money_sold) from sales where year=2009 group by city,brand; Πάλι το ίδιο δεν θα σου γυρίσει ? Εγώ λέω >select city,brand,SUM(money_sold) from sales where year=2009 group by city,brand; που θα γυρίσει το άθροισμα όλων αυτών των ημερών Το μαλ#$##μαστε πήγαινε στο ότι μπορεί η προσέγγιση να είναι λάθος γενικότερα. Όχι με εσένα.
taazz Δημοσ. 7 Δεκεμβρίου 2011 Δημοσ. 7 Δεκεμβρίου 2011 Θέλει να βρει το most profitable που σημαίνει ότι δεν θέλει να γυρίσει ανα city όλα τα brands σορταρισμένα (city , brand desc) αλλα αυτό To query που έχει δώσει θα επιστρέψει ανα πόλη το brand με τις μεγαλύτερες πωλήσεις μιας ημέρας του χρόνου. Δεχομαι ότι η δική σου ερμηνία είναι η σωστή. όπως είναι δομημένο το ερώτημα απαιτεί επιπλέων διευκρηνίσεις.
fonsde Δημοσ. 7 Δεκεμβρίου 2011 Μέλος Δημοσ. 7 Δεκεμβρίου 2011 αυτο σιγουρο.. ειναι λιγο γτπ η εκφωννηση, τεσπα ευχαριστω και τους 2. Πιστευω κατι εμαθα :rolleyes: Θα χρησιμοποιησω το τελευαιο που ποσταρε ο azetc . εχει λογικη πρωτα κανει το sum και μετα περνει το max.
Aztec Δημοσ. 7 Δεκεμβρίου 2011 Δημοσ. 7 Δεκεμβρίου 2011 Πάντως fonsde μακάρι να είναι σωστή η προσέγγιση του data warehouse Καθως μου λες ότι το money sold είναι το ποσό μιας πώλησης. Ποιάς πώλησης? Των πωλήσεων μιας ημέρας εννοείς. Δηλαδή στην ουσία σε αυτό το πεδίο πρέπει να κρατάς το σύνολο των πωλήσεων μιας ημέρας που έγιναν σε μια πόλη για ένα προιόν. Τα measures κρατάνε σύνολα και όχι transactions. Τι να πω . Over and out Δεχομαι ότι η δική σου ερμηνία είναι η σωστή. όπως είναι δομημένο το ερώτημα απαιτεί επιπλέων διευκρηνίσεις. To max() σκέτο όντως θα είχε σημασία αν ήταν μοναδική η πώληση και τον ένοιαζε η μάρκα με την πιο προσοδοφόρα πώληση το 2009. Σε αυτή την περίπτωση όμως πάει τσάμπα το data warehouse. Καθώς μαζεύει τα ποσά ανα ημέρα. Το query που έχω δώσει δεν είναι ορθό πάντως
Aztec Δημοσ. 8 Δεκεμβρίου 2011 Δημοσ. 8 Δεκεμβρίου 2011 Ναι εκ παραδρομής το έξω query δεν κάνει τίποτα ουσιαστικά. Αφήνει τα δεδομένα ίδια. Υπαρχουν λύσεις φυσικά αλλά βαριέμαι τα nested και τα subquery και είναι αργά. Μια elegant λύση είναι η εξής. >select city , brand from ( SELECT Brand.brand, Location.city, SUM(Sales.money_sold) , dense_rank() over (partition by city order by SUM(Sales.money_sold) desc) rank FROM Time, Location, Sales, Item, Brand WHERE Sales.time_key = Time.time_key AND Time.year = 2009 AND Sales.item_key = Item.item_key AND Item.brand_key = Brand.brand_key AND Sales.location_key = Location.location_key GROUP BY Location.city, Brand.brand) where rank=1; Αυτό θα σου γυρίσει για κάθε πόλη, το brand που όλο τον χρόνο έχει πουλήσει περισσότερο. Αν θέλεις περίμενε κανέναν παιδί να σου δώσει και κάτι σε nested γιατί πάω για ύπνο.
taazz Δημοσ. 8 Δεκεμβρίου 2011 Δημοσ. 8 Δεκεμβρίου 2011 Κάνεις λάθος . Αυτό τι θα σου γυρίσει > year day city brand money_sold 2009 1 1 1 200 2009 2 1 1 200 2009 3 1 1 300 2009 4 1 1 400 2009 5 1 1 500 2009 6 1 1 600 2009 7 1 1 700 >select city,brand,max(money_sold) from sales where year=2009 group by city,brand; Πάλι το ίδιο δεν θα σου γυρίσει ? Δεν αλλάζει κάτι. Η προϋγούμενη απαντηση μου ισχύει. Και για να το κάνω λίγο πιο κατανοητο παρόλο που με κάνει να εσθάνομαι λιγο μ@@@@ας. η έκφραση την μεγαλήτερη τιμή ημέρας που χρησιμοποιείς υπονοεί ότι έχεις πολλαπλές τιμές ανα ημέρα και επιστρέφεις αποτελέσματα για περισσότερες απο 1 ημέρες. Στην ουσία επιστρέφεις την υψηλότερη τιμη χρονικής περιόδου η οποία τυγχάνει να έχει ημερήσια περιοδικότητα στο παράδειγμα. Το μόνο που αλλάζει στα παραδείγματα σου είναι η περιοδος. Η διαφορά μας από ότι φαινεται είναι μόνο συντακτικού και δεν έχει καμιά σχέση με το πρόβλημα. Εγώ λέω >select city,brand,SUM(money_sold) from sales where year=2009 group by city,brand; που θα γυρίσει το άθροισμα όλων αυτών των ημερών Το μαλ#$##μαστε πήγαινε στο ότι μπορεί η προσέγγιση να είναι λάθος γενικότερα. Όχι με εσένα. Σε αυτό αναφέρθηκα στο πρώτο μου ποστ όπου έθεσα το θέμα προς συζήτηση και ανάφερα ότι μάλλον ζητάει sum. Δεν έδωσα μέχρι τώρα κανένα query για 2 λόγους 1) θα πρέπει να φτιάξω μια demo database και να κάνω δοκιμές, το οποίο και βαριέμαι. 2) εφόσον προκειται για άσκηση Θεωρώ ότι θα βοηθήσω περισσότερο με το να φέρω στην επιφάνεια τα λάθη και να εξηγήσω γιατί το θεωρώ λάθος από να δώσω ένα sql query. Σε αυτο το σημείο να προτήνω στον T/S να κατεβάσει και να εγκταστήσει ένα sql server να φτιάξει την βάση με δοκιμαστηκά δεδομένα και να τρέξει τα sql του να δει τα αποτελέσματα στην πράξη, είναι ο μονος τρόπος που ξέρω να επιβεβαίωνω τα query μου.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα