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

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

Δημοσ.

Καλησπέρα, έχω το εξής πρόβλημα σε ένα query, που προσπαθώ να τρέξω στην sql (χρησιμοποιω mysql).

 

Χρησιμοποιώντας inner join καταλήγω σε έναν πίνακα, ο οποίος αριστερά έχει κάποιες πολιτείες και δεξιά κάποιους κωδικούς. Αυτό που θέλω είναι για κάθε πολιτεία να βρω τον top κωδικό ( με την μεγαλύτερη συχνότητα δηλαδή).

 

Νομίζω δεν έχει αξία να σας μπερδέψω με τους αρχικούς μου πίνακες, οπότε σας δείχνω το query που περιέχει το join.

select location_table.locationADDR_state as "Rental's State (pickup)",car_table.categoryID
FROM
rental_table
JOIN location_table ON
rental_table.rental_pickup_location = location_table.locationID
JOIN car_table ON
car_table.carID = rental_table.carID;

το οποίο που επιστρέφει τον ακόλουθο πίνακα.

 

 

 

Attica                     2

MA                         1

Lazio                      2

Attica                     1

NY                         1

Thessaloniki          2

MA                         1

Thessaloniki          1

Thessaloniki          6

Thessaloniki          6

 

 

 

Αυτό που θέλω ουσιαστικά είναι να πάρω

Attica             1

Attica             2    /* εδω δεν ξερω αν γινεται να παρω και τις 2 τιμες, όταν έχουν την ίδια συχνότητα */

MA                1

Lazio             2

NY                 1

Thessaloniki  6

 

Γράφω το παρακάτω αλλά δεν δουλεύει:

select location_table.locationADDR_state as "Rental's State (pickup)",car_table.categoryID
FROM
rental_table
JOIN location_table ON
rental_table.rental_pickup_location = location_table.locationID
JOIN car_table ON
car_table.carID = rental_table.carID
group by location_table.locationADDR_state
order by count(car_table.categoryID) desc;

επιστρέφει αυτο:

Thessaloniki 2
Attica            2
MA               1
Lazio            2
NY                1
 
 
το παράδειγμα μου με τις τιμές είναι κακό, αλλά στην Θεσσαλονίκη θα έπρεπε να φέρει 6 (που έχει συχνότητα 2).
 

Μπορεί κάποιος να με βοηθήσει, να σκεφτεί τι κάνω λάθος;

Το σκεπτικό μου ήταν με την group by να ομαδοποιήσω τις πολιτείες, και με το order by να βρω σε φθήνουσα σειρά τον τοπ σε πληθος (count) κωδικό.

 

 

Ευχαριστώ

Δημοσ.

Δεν έχω καταλάβει σε αυτό που έχεις ως επιθυμητή έξοδο, με ποιο κριτήριο θες να σου διαφοροποιήσει την αττική αλλά να ομαδοποιήσει την Θεσσαλονίκη. Εννοώ υπάρχει κάποιο πεδίο που είναι διαφορετικό? Θέλω να πώ αν κάνεις groyp by locationADDR_state γτ η αττική να τυπώνεται δύο φορές?

Δημοσ.

Δεν έχω καταλάβει σε αυτό που έχεις ως επιθυμητή έξοδο, με ποιο κριτήριο θες να σου διαφοροποιήσει την αττική αλλά να ομαδοποιήσει την Θεσσαλονίκη. Εννοώ υπάρχει κάποιο πεδίο που είναι διαφορετικό? Θέλω να πώ αν κάνεις groyp by locationADDR_state γτ η αττική να τυπώνεται δύο φορές?

 

Ευχαριστω για την απαντηση. Δεν ξερω αν πρεπει να την διαφοροποιει, το ανεφερα απλα επειδη υπαρχει μια αττικη με κωδικο 1, και αλλη μια με κωδικο 2, και δεν ειναι ξεκαθαρο ποια θα επρεπε να επιστρεφει.

Αν ομως ειχε ας πουμε δυο φορες αττικη με κωδικο 2, και μια με κωδικο 1, κ επρεπε να επιστρεψει 2, εχεις καμια ιδεα;

Δημοσ.

Λοιπον, εφόσσον υπάρχουν 2 αττικές(διαφορετικοί κωδικοι), δες αν μπορείς να κάνεις το group by με κάποιο άλλο πεδιο π έχουν διαφορετικό (π.χ. Id). Επίσης εκτιμώ,αν κάνεις το Order πριν το group θα λύσει το πρόβλημα σου με το λάθος (Που έπρεπε να βγάζει 6). Αλλίως πρέπει να βάλεις το Max() στο αρχικό select.

Δημοσ.

Λογικά με column που κάνει select θα είσαι ΟΚ, αλλά δεν γνωρίζω αν το υποστηρίζει η MySQL (π.χ. SQL Server και Oracle δεν έχουν θέμα).

π.χ. κάτι της μορφής

SELECT
    lt.locationADDR_state,
    (SELECT TOP 1
        ct.categoryID
    FROM rental_table rt
        INNER JOIN location_table lt2
            ON lt2.locationID = rt.rental_pickup_location
        INNER JOIN car_table ct
            ON ct.carID = rt.carID
    WHERE lt2.locationADDR_state = lt.locationADDR_state
    GROUP BY lt2.locationADDR_state, ct.categoryID
    ORDER BY COUNT(ct.categoryID) DESC
    )
FROM location_table lt

Δηλαδή για κάθε περιοχή, θα κάνεις ένα sub-select που θα βγάζεις την λίστα με την συχνότητα για αυτή την περιοχή και θα διαλέγεις το top 1 από τα DESC αποτελέσματα.

Πιστεύω καταλαβαίνεις την λογική. Hope it helps.

PS: Το group by/order by ίσως θέλει κάποιες μικροαλλαγές, but that's life without a testing environment.
  • Like 1
Δημοσ.

 

Λογικά με column που κάνει select θα είσαι ΟΚ, αλλά δεν γνωρίζω αν το υποστηρίζει η MySQL (π.χ. SQL Server και Oracle δεν έχουν θέμα).

 

π.χ. κάτι της μορφής

 

SELECT
    lt.locationADDR_state,
    (SELECT TOP 1
        ct.categoryID
    FROM rental_table rt
        INNER JOIN location_table lt2
            ON lt2.locationID = rt.rental_pickup_location
        INNER JOIN car_table ct
            ON ct.carID = rt.carID
    WHERE lt2.locationADDR_state = lt.locationADDR_state
    GROUP BY lt2.locationADDR_state, ct.categoryID
    ORDER BY COUNT(ct.categoryID) DESC
    )
FROM location_table lt
Δηλαδή για κάθε περιοχή, θα κάνεις ένα sub-select που θα βγάζεις την λίστα με την συχνότητα για αυτή την περιοχή και θα διαλέγεις το top 1 από τα DESC αποτελέσματα.

 

Πιστεύω καταλαβαίνεις την λογική. Hope it helps.

 

PS: Το group by/order by ίσως θέλει κάποιες μικροαλλαγές, but that's life without a testing environment.

 

είναι σίγουρα σε καλύτερο δρόμο από το δικό μου, σε ευχαριστώ πολύ!

Ερώτηση, στον πίνακα location_table δίνεις 2 συντομεύσεις, ltκαι lt2 τις οποίες στην where εξισώνεις.

Αυτό γιατί έγινε; Έχει να κάνει με το κόκκινο που είπες στην παράθεση;

Δημοσ.

δυστυχώς ειμαι πολυ noob ακομα για να το κατανοήσω πληρως

 

Αυτο που εχεις γραψει, φερνει σωστα τις τιμες για τις πολιτειες, όμως παραλληλα φέρνει και πολιτειες που δεν θα επρεπε (δεν ανηκουν στην τομη των 3 πινακων)

 

Attica              2
Thessaloniki   6
MA                  1
NY                  1
Leicestershire Null
London         Null
Lazio             2
Toscana        Null
Δημοσ.

Ο πιο απλός τρόπος (θεωρητικά) θα ήταν να δώσεις όνομα στο column της sub-select και να βάλεις WHERE που να τσεκάρεις αν η στήλη αυτή εχει null.

 

Αν δεν παίζει απ'ευθείας, θα χρειαστεί να κάνεις το query σου στην μορφή

 

select COL_1, COL_2 FROM (   <-- τα ονόματα που έχεις δώσει στις στήλες στο query σου

   <Εδώ το κανονικό σου query>

) zzz

WHERE zzz.COL_2 IS NOT NULL

 

ή κάτι αντίστοιχο. Δεν γνωρίζω ιδιαιτερότητες MySQL δυστυχώς.

 

 

Edit: Αυτό με τα rows που έχουν null συμβαίνει επειδή επεξεργάζεσαι όλες τις εγγραφές από το table με τα locations, μιας και δεν γίνεται κάποιο φιλτράρισμα για να έχεις μόνο τις εγγραφές που έχουν τουλάχιστον ένα rented car.

  • Like 1
Δημοσ.

είναι σίγουρα σε καλύτερο δρόμο από το δικό μου, σε ευχαριστώ πολύ!

Ερώτηση, στον πίνακα location_table δίνεις 2 συντομεύσεις, ltκαι lt2 τις οποίες στην where εξισώνεις.

Αυτό γιατί έγινε; Έχει να κάνει με το κόκκινο που είπες στην παράθεση;

 

Αυτό λέγεται alias, το οποίο σε βοηθάει να χειρίζεσαι πιο εύκολα πίνακες και στήλες στα διάφορα clauses και joins, ώστε να μην γράφεις κάθε φορά ολόκληρο το όνομα.

  • Like 1
Δημοσ.

σας ευχαριστω για τις απαντησεις.

 

Να κανω αλλη μια ερωτηση follow up, μηπως γνωρίζετε.

Θέλω να φτιαξω εναν πινακα που θα εχει 3 στειλες με καποια συγκεκριμενα χαρακτηριστικα.

Αυτο που εχω καταφερει ειναι να φτιαξω 3 ξεχωριστα queries τα οποια μου δινουν 1η στηλη μηνες, και 2η στηλη το καθενα καποιες συγκεκριμενες τιμες.

Εγω θελω ομως να τα τρεξω και τα τρια μαζι, ετσι ωστε να προκυψει ενας πινακας στο τελος, μηνες, και 3 στηλες.

 

πως μπορω να το κανω; 

 

Αν έχει αξία τα queries μου ειναι τα παρακατω, ενω επισυναπτω και το τι επιστρεφει καθενα:

# 1 stili
SELECT month(rdate),
    (SELECT SUM(ramaount) 
     FROM my_table 
     WHERE (month(rdate) <(month(a.rdate)))
     and year(rdate)=2015
    ) as total_previous
FROM my_table a
where year(rdate)=2015
group by month(rdate)
order by year(rdate),month(rdate);


# 2 stili
select
    month(rdate) as month_2015,
    sum(ramaount)
    from     my_table
where    year(rdate) in (2015)
group by   month(rdate);


# 3h stili
SELECT month(rdate),
    (SELECT SUM(ramaount) 
     FROM my_table 
     WHERE (month(rdate) >(month(a.rdate)))
     and year(rdate)=2015
	) as total_next
FROM my_table a
where year(rdate)=2015
group by month(rdate)
order by year(rdate),month(rdate);
1η στηλη
1, 
3, 375
5, 1325
6, 3055
7, 4255
8, 10255
9, 10555
10, 10755
12, 10935
 
 

2η στηλη

1, 375
3, 950
5, 1730
6, 1200
7, 6000
8, 300
9, 200
10, 180
12, 1200
 
 
 
 

 

 

3η στηλη

'1, 11760
3, 10810
5, 9080
6, 7880
7, 1880
8, 1580
9, 1380
10, 1200
12, 

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

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

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

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

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

Σύνδεση

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

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