Ερώτημα SQL

zynif | Πέμ, 05/23/2013 - 20:11 | 2' | 8

Καλησπέρα. Γράφω ένα πρόγραμμα για καταχώρηση αποδείξεων και δεν έχω ιδέα πως μπορώ να φτιάξω ένα sql query.
Λοιπόν έχουμε τον παρακάτω πίνακα στον οποίο αποθηκεύονται κατά σειρά ο κωδικός του προϊόντος, ο κωδικός του καταστήματος από το οποίο αγοράστηκε , η τιμή ανά τεμάχιο και στην τελευταία στήλη ένας αριθμός που υποδηλώνει την ημερομηνία που καταγράφηκε η τιμή.
Όσο πιο μεγάλος είναι αυτός ο αριθμός τόσο πιο πρόσφατη είναι η ημερομηνία που αναπαριστά
[color=#ff0000]Ένα προϊόν μπορεί να είναι διαθέσιμο σε περισσότερα του ενός καταστήματα[/color]

Table Prices:
ProdID
PlaceID
Cost
JulDay

Θέλω ένα sql query όπου θα εμφανίζει για όλα τα προϊόντα που υπάρχουν στον πίνακα Prices :
προϊον, κατάστημα,πιο προφατη τιμή
δηλαδή

Προιον1 ,Κατάστημα1 ,15
Προιον1 ,Κατάστημα2 ,13
Προιον2 ,Κατάστημα3 ,7
......

Εαν μπορείτε να μου βρείτε και ερωτήμα που να απαντά στο παρακάτω θα σας ήμουν ιδιαίτερα ευγνώμων:
-Για καθε προϊον πόσες φορές έχει γίνει αλλάγη της τιμής του από όλα τα καταστήματα δηλαδή

Προιον1 ,Κατάστημα1 ,5 φορές
Προιον1 ,Κατάστημα2 ,3 φορές
Προιον2 ,Κατάστημα3 ,1 φορά
......

Ευχαριστώ!

Δώσε αστέρια!

MO: (ψήφοι: 0)

Σχόλια

select ProdID, PlaceID, Cost from Prices;

Για το δεύτερο ερώτημα θα χρειαστείς μάλλον trigger, και δεν έχω τον χρόνο να ξεσκονίσω τις γνώσεις μου πάνω σε αυτό για να σε βοηθήσω άμεσα.

Το πρώτο ερώτημα (εφόσον θέλεις να εμφανίζεις όλες τις καταχωρήσεις, το κριτήριο της ταξινόμησης είναι η πιο πρόσφατη τιμή και να είναι συγκεντρωμένες όλες οι καταχωρήσεις ενός προϊόντος και ενός καταστήματος), είναι:

SELECT * FROM prices ORDER BY julday DESC, prodid ASC, placeid ASC;

Για το δεύτερο ερώτημα, όπως θέλεις τα αποτελέσματα, δεν υπάρχει μια εντολή SQL και θα χρειαστείς και μεταβλητές. Είναι καλλίτερο να στείλες περισσότερες εντολές SQL, αλλά θα πρέπει να το συνδυάσεις με κώδικα.

Για το δεύτερο ερώτημα δοκίμασε το:
SELECT ProdID, PlaceID, count(*)
FROM (SELECT DISTINCT ProdID, PlaceID, Cost FROM Items)
GROUP BY ProdID, PlaceID;

Για το δεύτερο ερώτημα δοκίμασε το:
SELECT ProdID, PlaceID, count(*)
FROM (SELECT DISTINCT ProdID, PlaceID, Cost FROM Items)
GROUP BY ProdID, PlaceID;

-----------------------------------------------------------
Αυτο θα επιστρεψει μια γραμμη για παραπανω απο 2 γραμμες θα βγαλει error. Εκτος και αυτο θελει 1 γραμμη

Από ότι βλέπω η απάντηση του brezas δουλεύει

Για το πρώτο βρήκα αυτό από άλλο forum

WITH changes AS (
SELECT prodID, placeID, MAX(JulDat) last_updated, COUNT(JulDat) n_changes
FROM phoenix_table
GROUP BY prodID, placeID
)
SELECT pt.prodID, pt.placeID, n_changes, pt.cost
FROM phoenix pt
JOIN changes c
ON pt.prodID = c.prodID
AND pt.placeID = c.placeID
WHERE pt.JulDat = changes.last_updated;

και το
SELECT ProdID, Count( Distinct PlaceID )
FROM Prices
GROUP BY ProdID

Εναλλακτική λύση για το 2ο ερώτημα χωρίς SELECT DISTINCT (αν και προτιμάω τη πρώτη λύση):

SELECT ProdID, PlaceID, count(*)
FROM (SELECT ProdID, PlaceID, Cost, count(*)
FROM Items GROUP BY ProdID, PlaceID, Cost)
GROUP BY ProdID, PlaceID;

Για το πρώτο ερώτημα, μια λύση είναι το:

SELECT A.ProdID, A.PlaceID, A.Cost
FROM Items AS A INNER JOIN
(SELECT max(JulDay) AS Jd, ProdID, PlaceID
FROM Items GROUP BY ProdID, PlaceID) AS B
ON A.ProdID = B.ProdID AND A.PlaceID = B.PlaceID AND A.JulDay = B.Jd;

Η λύση που προτείνω, στην εσωτερική SELECT ομαδοποιεί τις εγγραφές του πίνακα κατά προϊόν και κατάστημα και βρίσκει τη μεγαλύτερη τιμή στο πεδίο JulDay για κάθε ομάδα.

Για το πρώτο βρήκα αυτό από άλλο forum
WITH changes AS (
SELECT prodID, placeID, MAX(JulDat) last_updated, COUNT(JulDat) n_changes
FROM phoenix_table
GROUP BY prodID, placeID
)
SELECT pt.prodID, pt.placeID, n_changes, pt.cost
FROM phoenix pt
JOIN changes c
ON pt.prodID = c.prodID
AND pt.placeID = c.placeID
WHERE pt.JulDat = changes.last_updated;

Απ' ότι καταλαβαίνω πρόκειται για την ίδια λύση στην ουσία, αλλά αν δεν κάνω λάθος η λύση που σου πρότειναν λειτουργεί στην Oracle μόνο. Αυτό που δεν καταλαβαίνω είναι γιατί χρησιμοποίησαν τους πίνακες phoenix και changes.

SELECT ProdID, Count( Distinct PlaceID )
FROM Prices
GROUP BY ProdID

Το συγκεκριμένο query μάλλον το πρότειναν για το 2ο ερώτημά σου. Δίνει την απάντηση στο ερώτημα από πόσα καταστήματα έχει αγοραστεί το κάθε προϊόν.

(Οff-topic. το Syntaxhighlighter λειτουργεί; Ενώ στη φόρμα του σχολίου φαίνεται ο κώδικας μέσα σε πλαίσιο, δεν εμφανίστηκε έτσι στο post σε firefox, chrome. Φταίει το ρημάδι το παραθύρι του ΗΥ της δουλειάς;)

Γιατί στο άλλο forum έχω το ψευδώνυμο phoenix :D
Για mysql πρέπει να φτιάξεις ένα view αντι για το with changes

Eγώ βλέπω κανοικά τον κώδικα σε quote στο forum. Δεν ξέρω τι γίνεται όμως όταν γράφεις το σχόλιο.Δεν είμαι σίγους αν εννοείς αυτό βέβαια.

Αυτό που δεν καταλαβαίνω είναι γιατί χρησιμοποίησαν τους πίνακες phoenix και changes.

Τώρα που ξαναβλέπω την απάντηση που σου έδωσαν στο άλλο φόρουμ, ένας είναι ο πίνακας, το changes είναι alias.