Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP] Statystyki sprzedaży
d.stp
post 17.02.2014, 18:21:49
Post #1





Grupa: Zarejestrowani
Postów: 358
Pomógł: 0
Dołączył: 19.04.2012

Ostrzeżenie: (0%)
-----


No i kolejny problem z zapytaniem do bazy mysql... businesssmiley.png

Robię statystyki sprzedaży w mini sklepie na autorskim skrypcie. Muszę wprowadzić coś w rodzaju statystyk sprzedaży.

Mam tabele "zarobki" gdzie trzymam całe info o wpływach ze sprzedaży produktów.

Chcę zrobić statystyki z każdego miesiąca, czyli generalnie to zrobiłbym to tak:

  1. SELECT * FROM `zarobki` WHERE `user_id` = 'user_id' AND `data` = '02-2014'


I to wyświetli mi statystyki z miesiąca luty 2014, ale potrzebuję statystyk z każdego dnia w tym miesiącu, czyli:

01-02-2014 | zarobki | id_usera
02-02-2014 | zarobki | id_usera
03-02-2014 | zarobki | id_usera
[...]
17-02-2014 | zarobki | id_usera

Do tego, żeby nie pokazywało statystyk z dni, których jeszcze nie było w tym miesiącu...

No i kompletnie nie wiem jak to zrobić :/

Ten post edytował d.stp 17.02.2014, 18:22:47
Go to the top of the page
+Quote Post
markonix
post 17.02.2014, 18:56:45
Post #2





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


Cytat(d.stp @ 17.02.2014, 18:21:49 ) *
Chcę zrobić statystyki z każdego miesiąca, czyli generalnie to zrobiłbym to tak:

  1. SELECT * FROM `zarobki` WHERE `user_id` = 'user_id' AND `data` = '02-2014'


I to wyświetli mi statystyki z miesiąca luty 2014


Szczerze wątpię chyba że masz taką beznadziejną strukturę bazy i trzymasz daty w formacie MM-YYYY.

Ogólnie najprościej pętlą jednak wtedy zapytań jest troszkę dużo - np. 31 w najgorszym wypadku.
Jednym zapytaniem też by szło, popróbowałbym z grupowaniem, SUM i na końcu order po kolumnie z dniami.


--------------------
Go to the top of the page
+Quote Post
d.stp
post 17.02.2014, 19:03:02
Post #3





Grupa: Zarejestrowani
Postów: 358
Pomógł: 0
Dołączył: 19.04.2012

Ostrzeżenie: (0%)
-----


Trzymam daty w formacie XX-XX-XXXX, jak mam inaczej trzymać? Tak jest mi najwygodniej.

Mógłbyś pomóc z tym zapytaniem? Majstruje od kilku godzin, ale nie mogę nic wymyślić.

W formularzu mam do wyboru miesiąc oraz rok. W PHP pobieram sobie te wartości z których użytkownik chce wyświetlić statystyki.

Nie mam pojęcia jak to zrobić... sad.gif

Próbowałem z pętlą FOR, tak na harpagana nawet:
  1. $data_dzisiejsza = date('d');
  2. for($i = 1, $i < $data_dzisiejsza, $i++) {
  3. echo '
  4. <tr>
  5. <td>data</td>
  6. <td>...</td>
  7. </tr>
  8. ';
  9. }


No ale to nie o to chodzi ;/
Go to the top of the page
+Quote Post
Turson
post 17.02.2014, 19:10:58
Post #4





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

Ostrzeżenie: (0%)
-----


Jeżeli trzymasz datę w formacie XX-XX-XXXX a nie RRRR-MM-DD to znaczy, że nie masz tej kolumny typu date bądź datetime. A to jest typ do trzymania dat
Go to the top of the page
+Quote Post
d.stp
post 17.02.2014, 19:15:55
Post #5





Grupa: Zarejestrowani
Postów: 358
Pomógł: 0
Dołączył: 19.04.2012

Ostrzeżenie: (0%)
-----


Pole z datą mam w varchar, nie wiedziałem o date i datetime.

No ale to nie jest chyba jakoś bardzo istotne teraz
Go to the top of the page
+Quote Post
markonix
post 17.02.2014, 22:24:20
Post #6





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


Cytat(d.stp @ 17.02.2014, 19:15:55 ) *
No ale to nie jest chyba jakoś bardzo istotne teraz

Czemu nie teraz? Chyba lepiej wcześnie zacząć konstruować strukturę bazy poprawnie?

Ten post edytował markonix 17.02.2014, 22:24:56


--------------------
Go to the top of the page
+Quote Post
mmmmmmm
post 17.02.2014, 23:22:47
Post #7





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


Co do daty to zmień czym prędzej.
Co do zaś zarobków, to możesz to zrobić na (przynajmniej) dwa sposoby:
1. zapytanie w stylu :
SELECT id_usera, data, sum(zarobki) FROM zarobki GROUP BY id_usera, data ORER BY id_usera, data
ale to ci nie wykaże WSZYSTKICH dni, tylko te, które są w bazie. Być może w święta nie ma zarobków, ale czy jest wtedy sens pokazywać datę bez wartości? Jeśli już się na to uprzesz to możesz to zrobić w po stronie PHP.
2. Skomplikowany SELECT, który uwzględnia wszystkie dni...
coś w stylu:
SELECT '01' dzien UNION SELECT '02' UNION SELECT '03' ...
i to połączyć do daty. dalej analogicznie.
W obu przypadkach zapytanie nie powinno pokazać zarobków z dni, których jeszcze nie było z tej prostej przyczyny, że takich rekordów nie pownno jeszcze być.
Go to the top of the page
+Quote Post
Martin-ZG
post 18.02.2014, 09:51:31
Post #8





Grupa: Zarejestrowani
Postów: 28
Pomógł: 3
Dołączył: 23.07.2009

Ostrzeżenie: (10%)
X----


Cytat(d.stp @ 17.02.2014, 18:21:49 ) *
No i kolejny problem z zapytaniem do bazy mysql... businesssmiley.png

Robię statystyki sprzedaży w mini sklepie na autorskim skrypcie. Muszę wprowadzić coś w rodzaju statystyk sprzedaży.

Mam tabele "zarobki" gdzie trzymam całe info o wpływach ze sprzedaży produktów.

Chcę zrobić statystyki z każdego miesiąca, czyli generalnie to zrobiłbym to tak:

  1. SELECT * FROM `zarobki` WHERE `user_id` = 'user_id' AND `data` = '02-2014'


I to wyświetli mi statystyki z miesiąca luty 2014, ale potrzebuję statystyk z każdego dnia w tym miesiącu, czyli:

01-02-2014 | zarobki | id_usera
02-02-2014 | zarobki | id_usera
03-02-2014 | zarobki | id_usera
[...]
17-02-2014 | zarobki | id_usera

Do tego, żeby nie pokazywało statystyk z dni, których jeszcze nie było w tym miesiącu...

No i kompletnie nie wiem jak to zrobić :/


Spróbuj pokombinować z wyrażeniami regularnymi. http://tom000.info/blog/mysql__wyrazenia_regularne.htmlKurs wyrażeń regularnych w MySQL

Poniżej masz wzorzec do formatu dwie cyfry od 0-9 plus -02-2013
Kod
^([0-9]{2}-02-2013)$


A tutaj stronę do testowania wyrażeń http://regexp.pl

Myślę, że w ten sposób powinno ci się udać otrzymać wyniki, które będziesz mógł przepuścić przez tą pętlę.

  1. $data_dzisiejsza = date('d');
  2. for($i = 1, $i < $data_dzisiejsza, $i++) {
  3. echo '
  4. <tr>
  5. <td>data</td>
  6. <td>...</td>
  7. </tr>
  8. ';
  9. }


Z tym, że wydaje mi się że $data_dzisiejsza musisz zrzutować na int, bo date chyba zwraca string.

Ten post edytował Martin-ZG 18.02.2014, 09:56:42
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 27.04.2024 - 10:52