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

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

Δημοσ.

Καλησπερα σε ολους,

λοιπον εχω εναν πινακα με πωλησεις και στηλες (id, πελατης, ημερομηνια_παραλαβης, ημερομηνια_επιστροφης) και αλλο πινακα με στοιχεια του πελατη. Θελω να φτιαξω ενα query που να επιστρεφει, ποσοι πελατες ειχαν εστω μια παραλαβη ΚΑΘΕ μηνα.

 

Δημοσ. (επεξεργασμένο)

Σε αυτούς του 2 πίνακες υπάρχει κοινός παρονομαστής το ID του πελάτη σωστά; Επίσης SQL ή MySQL;

Επεξ/σία από leonidas_fs
Δημοσ.

πως μπορω μεσω του inner join να δω ποιοι πελατες παρηγγειλαν καθε μηνα? Την ξερω την εντολή δεν ειμαι πολυ αρχαριος αλλα δεν μπορω να καταλαβω πως συνδεονται

Δημοσ.

Θα κανεις το join statement και στο τέλος για την ημερομηνία θα κάνεις where date between 01/01/2018 and 01/31/2018

Δηλαδή

select customer.customer.id, firstname, lastname,sale.sale_id, amount,  date from customer inner join  sale on customer.customer_id = sale.customer_id where...

 

Κακως στα λέω πάντως πρέπει να τα κατανοήσεις!

Δημοσ.

Μαλλον δεν εχω εκφρασει σωστα την ερωτηση, αφου δεν ειναι τοσο απλα.

Θελω να ελεγξω αν ο πελατης "1" εχει κανει τουλάχιστον 1 παραγγελία μεταξυ 1/1 και 31/1, και 1/2 - 28/2 κοκ. Δήλαδη αν εχω την βαση για 50 μηνες για να μου εμφανίσει το query τους πελατες που εχουν κανει παραγγελια καθε εναν απο του 50 μηνες ξεχωριστά.

Δημοσ.

Δεν μπορω να σκεφτω την συνθηκη η οποια θα απομονώνει τους μηνες, ωστε να βρω τους πελατες που εχουν κανει παραγγελία. Αυτος ειναι και ο λογος που δημοσίευσα την απορια μου.

Δημοσ. (επεξεργασμένο)

Δεν χρειάζεται join,  για αυτό που ζητάς όλη η πληροφορία είναι στο table που περιγράφεις. Η λογική είναι να γκρουπάρεις τις πωλήσεις ανά πελάτη, χρόνο και μήνα . Το αποτέλεσμα θα σου δώσεις ποιοί πελάτες είχαν έστω μία πώληση ανά μήνα.

SELECT COUNT(salescolumn), customer_id
FROM someTable  
GROUP BY customer_id, YEAR(date_column), MONTH(date_column)

Αν θες να βρεις ποιοί πελάτες είχαν πωλήσεις σε κάθε μήνα και ξέρεις πόσους μήνες έχεις να ψάξεις, το count(salescolumn) θα πρέπει να είναι όσοι και οι μήνες, δηλαδή

SELECT COUNT(salescolumn) as total, customer_id
FROM someTable  
WHERE total >= ...
GROUP BY customer_id, YEAR(date_column), MONTH(date_column)

Στα τυφλά και με σύνταξη που δεν πρέπει να είναι valid postgres οπότε θα το ψάξεις λίγο παραπάνω.

 

edit: άκυρο, το 2ο κομμάτι δεν ισχύει 😕

Επεξ/σία από alou
  • Like 1
Δημοσ.

Δύο τρόποι μου έρχονται για να γίνει αυτό που θες.

Ένα, εισάγεις κάπου ένα πίνακα που σου χρειάζεται μόνο για το query. Βάζεις id, mindate, maxdate όπου τα dates είναι ανά μήνα, κάνεις join και με αυτό τον πίνακα on ανάμεσα στα dates και group by id mindate. Αυτό θα σου αφήσει εν τέλει ένα row για κάθε μήνα όπου το mindate είναι η πρώτη του μηνός. Αυτή η μέθοδος έχει το πλεονέκτημα πως αν θες, με κατάλληλο join μπορείς να πάρεις rows και για τα διαστήματα που δεν υπάρχουν δεδομένα.

Δύο, χρησιμοποιείς ένα ενδιάμεσο temp table στο query όπου βάζεις ένα column να είναι year της ημερομηνίας των δεδομένων σου επί 12 + μήνας της ημερομηνίας των δεδομένων σου. Τώρα που το έχεις έτσι, μπορείς να κάνεις join με αυτόν και group by αυτό το column. Από την τιμή του στα αποτελέσματα μπορείς να βρεις και πάλι έτος και μήνα.

Δημοσ. (επεξεργασμένο)

Λέω μία ιδέα πως μπορείς να το κάνεις σαν πρόγραμμα όμως (Δεν ξέρω αν είναι εφαρμόσιμο με SQL) μπορείς όμως να το κάνεις με κάποια γλώσσα προγραμματισμού.

1. Παίρνεις τους πελάτες του κάθε μήνα ξεχωριστά δηλαδή για Ιανουάριο 2018 select Πελάτη if Ημερομηνία αγοράς Ιανουάριος, μετά το ίδιο για κάθε μήνα.  Έχεις πχ 50 λίστες με id Πελατών

2. Τα κάνεις set (ίσως) Δεν χρειάζεται δηλαδή τον πελάτη 12 πχ να τον έχεις περισσότερες από μία φορές σε ένα μήνα.

3. Παίρνεις το intersection (τομή).

Επειδή είναι Α τομή Β τομή Γ = (A τομή Β ) τομή Γ μπορείς να το κάνεις με recursion.

Βοηθάει να αριθμήσεις τους μήνες που θες στον πίνακα σου ώστε να ρωτάς select Πελάτη if minas_αγοράς 1κλπ

Ψευτοκώδικας

monadikoi_pelates = set(select pelatis from table_agoron where minas_agoras ==1)//παιρνεις του πελατες του 1ου μήνα
for i in range (2,max(minas_agoras)//παίρνεις την τομή με τους πελάτες κάθε επόμενου μήνα
	monadikoi_pelates = intersection (monadikoi_pelates, set(select pelatis from table where minas ==i))

Αυτοί που θα μείνουν είναι αυτοί που θες.

Επεξ/σία από k33theod
Δημοσ.
Στις 23/11/2018 στις 9:54 ΜΜ, mikebol είπε

Μαλλον δεν εχω εκφρασει σωστα την ερωτηση, αφου δεν ειναι τοσο απλα.

Θελω να ελεγξω αν ο πελατης "1" εχει κανει τουλάχιστον 1 παραγγελία μεταξυ 1/1 και 31/1, και 1/2 - 28/2 κοκ. Δήλαδη αν εχω την βαση για 50 μηνες για να μου εμφανίσει το query τους πελατες που εχουν κανει παραγγελια καθε εναν απο του 50 μηνες ξεχωριστά.

Δεν ξέρω αν το καταλαβαίνω λάθος αλλά ένα απλό group by δεν είναι;...

https://www.db-fiddle.com/f/xj9qTneZszZRsWqDJLqwPU/1

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

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

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

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

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

Σύνδεση

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

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