Πως γίνεται το αθροισμα όλων των τιμων ενος πινακα.

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
ewigkeit
Δημοσιεύσεις: 36
Εγγραφή: 26 Μάιος 2008 17:15

Πως γίνεται το αθροισμα όλων των τιμων ενος πινακα.

Δημοσίευση από ewigkeit » 01 Ιουν 2010 21:14

Γεια σας!

Έχω ένα μικρό πρόβλημα με ενα mysql ερώτημα ..

Θα ήθελα να ρωτήσω, πώς μπορω άθροισω όλες τις τιμές που έχω στον πινακα μου κατά date range.

Για να συνοψίσω το ερώτημά μου, θέλω να δημιουργησω 2 πεδία κειμένου, όπου θα καταχωρω τις 2 ημερομηνίες, και μετα πατωντας submit , να μου άθροιζει αυτόματα όλα τις τιμές που υπάρχουν σε καθε μία στήλη του πίνακα μου.

Ο πινακας έχει μόνο αριθμητικές τιμές σε όλες τις στήλες, και ένα πεδίο ημερομηνίας.

Οποιαδήποτε βοήθεια θα ήταν πολύ ευπρόσδεκτη γιατι αυτο θα μου λυσει τα χερια... :)

Ευχαριστώ πολυ προκαταβολικα:)

Επι του παρόντος το ερωτημα ειναι το παρακάτω:

Κώδικας: Επιλογή όλων

$query_kiniseis = "SELECT * FROM kiniseis ORDER BY `date` {$_REQUEST['dateorder']}";

Άβαταρ μέλους
soteres2002
S. & H. Moderator
Δημοσιεύσεις: 1524
Εγγραφή: 05 Μαρ 2004 22:17
Τοποθεσία: Ιωάννινα

Πως γίνεται το αθροισμα όλων των τιμων ενος πινακα.

Δημοσίευση από soteres2002 » 01 Ιουν 2010 21:17

Κώδικας: Επιλογή όλων

$query_kiniseis = "SELECT * FROM kiniseis ORDER BY `date` {$_REQUEST['dateorder']}";
Το πρόβλημα αυτό λύνεται κάνοντας χρήση τελεστή συνάθροισης αθροίσματος και ώς εκ τούτου με ένα GROUP BY * HAVING(**) clause για να φράξεις τις ημερομηνίες στο εύρος τιμών που ενδιαφέρει την εφαρμογή σου.

Το ερώτημα λοιπόν είναι:

Κώδικας: Επιλογή όλων

SELECT SUM&#40;FIELD&#41; FROM KINISEIS GROUP BY DATE HAVING DATE BETWEEN '<START_DATA>' AND '<END_DATE>';
Το υποερώτημα από HAVING DATA και μετά μπορεί να γραφεί ισοδύναμα και με άλλους τρόπους όπως τη συνάρτηση DATEBETWEEN ή DATEDIFF κτλ.

Όπως και να χει το ερώτημα που σου έδοσα είναι σχεδόν σίγουρο ότι θα σου δουλέψει χωρίς πρόβλημα δεδομένης της ΒΔ σου, και επομένως δεν νομίζω να χρειαστεί να κάνεις κάτι πιο πολύπλοκο στο β' sub-clause του SQL statement.

Μόνο πρόσεξε το ενδεχόμενο όπου η σχέση αυτή kiniseis είναι μέλος μιας πιο σύνθετης σχέσης, δηλαδή άν υπάρχουν FOREIGN KEYS προς άλλους πίνακες.

Τότε θα πρέπει να κάνεις φυσική συνένωση σε όλες τις σχέσεις που συμμετέχουν σε συσχέτιση σχέσεων, δηλαδή να βάλεις "FROM kiniseis, TABLE_1, TABLE_2, ..., TABLE_N WHERE TABLE_1.id = TABLE_2.id = ... = TABLE_N.id" στο ερώτημα. Αυτό πιο συγκεκριμένα παίρνει το καρτεσιανό γινόμενό τους και το ελαχιστοποιεί (δηλαδή αφαιρούνται από αυτό κ-άδες με μη-ίσα primary keys) ώς προς τις ίσες τιμές των πρωτευόντων κλειδιών τους.

Ελπίζω να έγινα κατανοητός.

ewigkeit
Δημοσιεύσεις: 36
Εγγραφή: 26 Μάιος 2008 17:15

Πως γίνεται το αθροισμα όλων των τιμων ενος πινακα.

Δημοσίευση από ewigkeit » 01 Ιουν 2010 21:34

Eυχαριστώ πολυ :)

Κώδικας: Επιλογή όλων

SELECT SUM&#40;FIELD&#41; FROM KINISEIS GROUP BY DATE HAVING DATE BETWEEN '<START_DATA>' AND '<END_DATE>'; 
Oσον αφορά το FIELD... θα κανω το ερωτημα για κάθε στηλη ξεχωριστά ετσι? Πχ

Κώδικας: Επιλογή όλων

SELECT SUM kiniseis.στηλη1, kiniseis.στηλη2, kiniseis.στηλη3 κτλ
FROM kiniseis GROUP BY DATE HAVING DATE BETWEEN '<START_DATA>' AND '<END_DATE>';
Ναι σε καταλαβα , ευτυχως ομως δεν εχει foreign keys :D

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Πως γίνεται το αθροισμα όλων των τιμων ενος πινακα.

Δημοσίευση από dva_dev » 01 Ιουν 2010 21:42

Θέλεις άθροισμα για κάθε ημερομηνία ξεχωριστά ανάμεσα σε αυτές που ορίζουν το δίαστημα ή ένα άθροισμα συνολικά για όλες τις ημερομηνίες;

Επιπλέον το `date` δεν συνίσταται για όνομα πεδίου (υπάρχει σαν keyword), καλύτερα να το αλλάξεις σε κάτι έστω και ελάχιστα διαφορετικό.

ewigkeit
Δημοσιεύσεις: 36
Εγγραφή: 26 Μάιος 2008 17:15

Πως γίνεται το αθροισμα όλων των τιμων ενος πινακα.

Δημοσίευση από ewigkeit » 01 Ιουν 2010 21:47

dva_dev έγραψε:Θέλεις άθροισμα για κάθε ημερομηνία ξεχωριστά ανάμεσα σε αυτές που ορίζουν το δίαστημα ή ένα άθροισμα συνολικά για όλες τις ημερομηνίες;

Επιπλέον το `date` δεν συνίσταται για όνομα πεδίου (υπάρχει σαν keyword), καλύτερα να το αλλάξεις σε κάτι έστω και ελάχιστα διαφορετικό.
Oχι ξεχωριστα..
Ενα αθροισμα συνολικο για καθε στηλη , μεταξυ 2 ημερομηνιων θελω.

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Πως γίνεται το αθροισμα όλων των τιμων ενος πινακα.

Δημοσίευση από dva_dev » 01 Ιουν 2010 21:51

Τότε μάλλον αυτό που χρειάζεσαι είναι

Κώδικας: Επιλογή όλων

SELECT SUM&#40;FIELD&#41; FROM KINISEIS WHERE DATE BETWEEN '<START_DATA>' AND '<END_DATE>';

Άβαταρ μέλους
soteres2002
S. & H. Moderator
Δημοσιεύσεις: 1524
Εγγραφή: 05 Μαρ 2004 22:17
Τοποθεσία: Ιωάννινα

Πως γίνεται το αθροισμα όλων των τιμων ενος πινακα.

Δημοσίευση από soteres2002 » 01 Ιουν 2010 21:53

DVA, το ερώτημα αυτό είναι ισοδύναμο στην ΜySQL. Το δοκίμασα και όλας σε ένα παράδειγμα πριν απαντήσω εδώ...
Απλώς αυτό που πρότεινα εγώ σου φτιάχνει ένα GROUP πλειάδων μεταξύ ενός άνω και ενός κάτω ορίου για μία ημερομηνία... Για αυτο κότσαρα και το ΗAVING μετά το group by...

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Πως γίνεται το αθροισμα όλων των τιμων ενος πινακα.

Δημοσίευση από dva_dev » 01 Ιουν 2010 21:59

Σορρυ αν κάνω λάθος, αλλά νόμιζα ότι αν δώσεις από 1/1/2010 - 15/1/2010 θα φτιάξει ξεχωριστά αθροίσματα για κάθε μέρα. π.χ.:
1/1/2010 -> 1000
2/1/2010 -> 1200
3/1/2010 -> 500
κ.λπ

Θα περιορίσει δηλαδή τα αθροίσματα στο range που δίνεις, σπάζοντας τα ανά ημερομηνία (group by date).
[edit]το σπάζοντας τα ανά ημερομηνία που ανέφερα, στην περίπτωση που δεν υπάρχει ώρα, λεπτά και δευτερόλεπτα μέσα, γιατί αλλιώς χάνεις το μπούσουλα[/edit]

Και πάλι sorry αν κάνω λάθος (δεν το έχω δοκιμάσει).

Άβαταρ μέλους
soteres2002
S. & H. Moderator
Δημοσιεύσεις: 1524
Εγγραφή: 05 Μαρ 2004 22:17
Τοποθεσία: Ιωάννινα

Πως γίνεται το αθροισμα όλων των τιμων ενος πινακα.

Δημοσίευση από soteres2002 » 01 Ιουν 2010 22:06

Έχεις δίκιο αλλά μόνο στην περίπτωση που δεν βάζεις HAVING sub-clause. Aν το βάλεις σου φτιάχνει 1 ή > 1 cluster πλειάδων του πίνακα για τις οποίες ισχύει το τελούμενο του HAVING. Τώρα επειδή το περιορίζεις ώς προς την ημερομηνία το ερώτημα θα σου φτιάξει 1 cluster πλειάδων BY DATE RANGE.

Δεν ξέρω αν είναι standards compliant αυτό ή δεν είναι απο δική μου παρανόηση, αλλά πάντως δουλεύει γενικώς σωστά...

Γενικώς έχω παρατηρήσει οτι η ΜySQL δεν είναι τόσο compliant με το SQL ISO πρότυπο.
Κάποια πρότυπα ερωτήματα μπορεί και να μην δουλέουν καν σε ΜySQL server...

Άβαταρ μέλους
soteres2002
S. & H. Moderator
Δημοσιεύσεις: 1524
Εγγραφή: 05 Μαρ 2004 22:17
Τοποθεσία: Ιωάννινα

Πως γίνεται το αθροισμα όλων των τιμων ενος πινακα.

Δημοσίευση από soteres2002 » 01 Ιουν 2010 22:12

ewigkeit έγραψε:Eυχαριστώ πολυ :)

Κώδικας: Επιλογή όλων

SELECT SUM&#40;FIELD&#41; FROM KINISEIS GROUP BY DATE HAVING DATE BETWEEN '<START_DATA>' AND '<END_DATE>'; 
Oσον αφορά το FIELD... θα κανω το ερωτημα για κάθε στηλη ξεχωριστά ετσι? Πχ

Κώδικας: Επιλογή όλων

SELECT SUM kiniseis.στηλη1, kiniseis.στηλη2, kiniseis.στηλη3 κτλ
FROM kiniseis GROUP BY DATE HAVING DATE BETWEEN '<START_DATA>' AND '<END_DATE>';
Ναι σε καταλαβα , ευτυχως ομως δεν εχει foreign keys :D
Αν έχεις πολλές στήλες τότε στο ίδιο ερώτημα θα κάνεις τόσα SUM, τα οποία μάλιστα θα χωρίσεις το καθένα από το άλλο με κόμμα, όσα και οι στήλες που περιέχουν τιμές τις οποίες θες να αθροίσεις..

πχ αν έχεις έναν πίνακα με στοιχήματα και 3 στήλες: αξία, απόδοση, άλλο, θα κάνεις:

Κώδικας: Επιλογή όλων

SELECT ... SUM&#40;αξία&#41;, SUM&#40;απόδοση&#41;, SUM&#40;άλλο&#41; ...
απλώς κάνε deploy την λύση που σου πρότεινα και πες μας αμα δουλεύει για σένα...

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Πως γίνεται το αθροισμα όλων των τιμων ενος πινακα.

Δημοσίευση από dva_dev » 01 Ιουν 2010 22:16

Μόλις έκανα μια δοκιμή για να μου φύγει η απορία. Τα data και τα αποτελέσματα είναι τα εξής:

Κώδικας: Επιλογή όλων

mysql> select * from tmp1 order by dtDate, money;
+-------+------------+
| money | dtDate     |
+-------+------------+
|     1 | 2010-01-01 |
|   100 | 2010-01-01 |
|     2 | 2010-01-02 |
|   200 | 2010-01-02 |
|     3 | 2010-01-03 |
|   300 | 2010-01-03 |
|     4 | 2010-01-04 |
|   400 | 2010-01-04 |
|     5 | 2010-01-05 |
|   500 | 2010-01-05 |
+-------+------------+
10 rows in set &#40;0.00 sec&#41;

mysql> select sum&#40;money&#41; from tmp1 where dtDate between '2010-01-01' and '2010-01-03';
+------------+
| sum&#40;money&#41; |
+------------+
|        606 |
+------------+
1 row in set &#40;0.00 sec&#41;

mysql> select sum&#40;money&#41; from tmp1 group by dtDate having dtDate between '2010-01-01' and '2010-01-03';
+------------+
| sum&#40;money&#41; |
+------------+
|        101 |
|        202 |
|        303 |
+------------+
3 rows in set &#40;0.00 sec&#41;

Άβαταρ μέλους
soteres2002
S. & H. Moderator
Δημοσιεύσεις: 1524
Εγγραφή: 05 Μαρ 2004 22:17
Τοποθεσία: Ιωάννινα

Πως γίνεται το αθροισμα όλων των τιμων ενος πινακα.

Δημοσίευση από soteres2002 » 01 Ιουν 2010 22:20

WOW! Πολύ παράξενο αυτό, το τελευταίο ερώτημά σου στο δικό μου test server
μου επιστρέφει μία μόνο πλειάδα με το συνολικό άθροισμα το οποίο είναι και σωστό
γιατί έκανα το άθροισμα κι εγώ με το μάτι...

Άρα υποπτεύομαι πως το δικό σου ερώτημα δουλευει γενικώς σωστά... :hammer:

Άβαταρ μέλους
soteres2002
S. & H. Moderator
Δημοσιεύσεις: 1524
Εγγραφή: 05 Μαρ 2004 22:17
Τοποθεσία: Ιωάννινα

Πως γίνεται το αθροισμα όλων των τιμων ενος πινακα.

Δημοσίευση από soteres2002 » 01 Ιουν 2010 22:22

Για του λόγου το αληθές, δες εδώ:

Κώδικας: Επιλογή όλων

mysql> select sum&#40;val&#41; from example group by dat having dat between '2010-06-01' and '2010-06-01';
+----------+
| sum&#40;val&#41; |
+----------+
|     1110 |
+----------+
1 row in set &#40;0.00 sec&#41;

mysql> exit

και ο πίνακας περιέχει μόνο 3 εγγραφές με τιμές 10 , 100 και 1000 στο πεδίο val.
Δοκίμασα σε version 5.1.45-community σε Windows...

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6231
Εγγραφή: 30 Νοέμ 2004 03:09

Πως γίνεται το αθροισμα όλων των τιμων ενος πινακα.

Δημοσίευση από fafos » 01 Ιουν 2010 22:27

soteres... exeis mia hmeromhnia.. opote dinei sosto to apotelesma.. ana doseis mia diaforetikh tha sou ta vgalei lathos..

Άβαταρ μέλους
soteres2002
S. & H. Moderator
Δημοσιεύσεις: 1524
Εγγραφή: 05 Μαρ 2004 22:17
Τοποθεσία: Ιωάννινα

Πως γίνεται το αθροισμα όλων των τιμων ενος πινακα.

Δημοσίευση από soteres2002 » 01 Ιουν 2010 22:29

REEDIT

DVA, έχεις δίκιο. Έγινε λάθος σε μένα και παρασύρθηκα από το ίδιο λάθος που ξαναέκανα κάποτε...

Τελικά η σωστή απάντηση είναι αυτή που δεν έχει GROUP BY, δηλαδή το δεύτερο ερώτημά σου DVA.

Να το λάβει υπόψην του και ο χρήστης που ρώτησε αρχικά!! :hammer:

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης