Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Δεν θα παίξει σωστά. Αυτο θα σου γυρίσει ανα city το brand με το μεγαλύτερο ποσό ημέρας και όχι όλου του χρονου.

 

Δεν νομίζω, δεν υπάρχει κανένα πεδίο από τον πίνακα time στο group by στο αποτέλεσμα θα λυφθούν υπ'όψιν όλη η βάση χωρίς κανένα χρονικό περιορισμό.

 

 

Πρέπει πρώτα να αθροίσεις και μετά να βρεις το μέγιστο του αθροίσματος.

 

Θέλεις max στο sum ή analytical function κατάταξης βάσει του ποσού.

 

μόνο ένα order by στο sum θέλει για να έρθουν τα μεγαλήτερα πάνω όχι max.

Δημοσ.

δεν μπορω να δω αν παιζει απλα μας ζητανε 2 query στον αερα :-(

 

λεει find the most profitable (hint: max(money_sold)) brands aggregated by city in 2009

 

οπου το money sold ειναι το money μιας πωλησης

Δημοσ.

Δεν νομίζω, δεν υπάρχει κανένα πεδίο από τον πίνακα 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μαστε

Δημοσ.

δεν μπορω να δω αν παιζει απλα μας ζητανε 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.

Δημοσ.

Σε αυτή την περίπτωση το 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 κάνεις λάθος . Εκτός και αν σήμερα κάνουν πουλάκια τα μάτια μου. Είναι πιθάνο ...

 

Λοιπόν ο 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μαστε

 

Δεν με αφορά τι κάνετε κρατήστε το για τον εαυτό σας αν είναι δυνατόν.

Δημοσ.

Κάνεις λάθος .

 

Αυτό τι θα σου γυρίσει

 

>
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;

 

που θα γυρίσει το άθροισμα όλων αυτών των ημερών

 

Το μαλ#$##μαστε πήγαινε στο ότι μπορεί η προσέγγιση να είναι λάθος γενικότερα. Όχι με εσένα.

Δημοσ.

Θέλει να βρει το most profitable που σημαίνει ότι δεν θέλει να γυρίσει ανα city όλα τα brands σορταρισμένα (city , brand desc) αλλα αυτό

 

To query που έχει δώσει θα επιστρέψει ανα πόλη το brand με τις μεγαλύτερες πωλήσεις μιας ημέρας του χρόνου.

 

Δεχομαι ότι η δική σου ερμηνία είναι η σωστή. όπως είναι δομημένο το ερώτημα απαιτεί επιπλέων διευκρηνίσεις.

Δημοσ.

αυτο σιγουρο.. ειναι λιγο γτπ η εκφωννηση, τεσπα ευχαριστω και τους 2. Πιστευω κατι εμαθα :rolleyes: :rolleyes:

 

Θα χρησιμοποιησω το τελευαιο που ποσταρε ο azetc . εχει λογικη πρωτα κανει το sum και μετα περνει το max.

Δημοσ.

Πάντως fonsde μακάρι να είναι σωστή η προσέγγιση του data warehouse Καθως μου λες ότι το money sold είναι το ποσό μιας πώλησης. Ποιάς πώλησης? Των πωλήσεων μιας ημέρας εννοείς.

 

Δηλαδή στην ουσία σε αυτό το πεδίο πρέπει να κρατάς το σύνολο των πωλήσεων μιας ημέρας που έγιναν σε μια πόλη για ένα προιόν. Τα measures κρατάνε σύνολα και όχι transactions.

 

Τι να πω .

 

Over and out

 

Δεχομαι ότι η δική σου ερμηνία είναι η σωστή. όπως είναι δομημένο το ερώτημα απαιτεί επιπλέων διευκρηνίσεις.

 

To max() σκέτο όντως θα είχε σημασία αν ήταν μοναδική η πώληση και τον ένοιαζε η μάρκα με την πιο προσοδοφόρα πώληση το 2009. Σε αυτή την περίπτωση όμως πάει τσάμπα το data warehouse. Καθώς μαζεύει τα ποσά ανα ημέρα.

 

Το query που έχω δώσει δεν είναι ορθό πάντως :-)

Δημοσ.

Ναι εκ παραδρομής το έξω 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 γιατί πάω για ύπνο.

Δημοσ.

Κάνεις λάθος .

 

Αυτό τι θα σου γυρίσει

 

>
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 μου.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...