Witam. Wykonuje właśnie wykres zakupień w poszczególnych miesiącach. Do wyodrębnienia ilości produktów zakupionych w poszczególnych miesiącach używam MONTH, wynik zapisuje do zmiennej ilość, i przyporządkowywuje do wykresu.
Wszystko ok, lecz na pewno się na uniknąć dwunastu zapytań do bazy, do jakiejś mniejszej ilości. Czy znacie taki sposób?
Nie wiem czy dobrze Cię rozumiem, bo średnie po polsku to napisane, ale myślę że potrzebujesz użyć GROUP BY
.
Baza MySql
Pokaż w jaki sposób teraz wyciągasz te dane, albo skorzystaj z mojego poprzedniego posta.
Dane wyświetlam w ten sposób, do zmiennej zapisują się tylko liczba produktów sprzedana w listopadzie.
$stmt =$this->db->prepare('SELECT data_zakupu FROM zrealizowane WHERE MONTH(data_zakupu)=11');
$stmt->execute();
$date_accomplish = $stmt->rowCount();
Zobacz do czego służy SUM
, COUNT
I GROUP BY
.
A jak się później odnieść do wartości z poszczególnego miesiąca? Będe wdzięczny za przykład, nawet z głowy.
Wykonałem takie zapytanie na razie na listopad i grudzień, zlicza wszystko fajnie, lecz jak przenieść do tabeli poszczególne wartości?
$view = new VIEW();
$stmt =$this->db->prepare('SELECT data_zakupu, COUNT(*) FROM zrealizowane WHERE MONTH(data_zakupu)=11 OR MONTH(data_zakupu)=12 GROUP BY MONTH(data_zakupu) ');
$stmt->execute();
//$date_accomplish = $stmt->rowCount();
//echo 'ilość dni w aktualnym miesiącu to: ' . date("t");
//var_dump(range(1, date("t")));
//$row = $stmt->fetch(PDO::FETCH_ASSOC);
foreach($stmt as $row)
{
echo '<pre>';
var_dump($row );
echo '</pre>';
}
Żeby odnieść się do poszczególnych wartości to to zapytanie według mnie by musiało wyglądać tak
SELECT data_zakupu, COUNT(*) FROM zrealizowane WHERE MONTH(data_zakupu)=11 OR MONTH(data_zakupu)=12 GROUP BY data_zakupu
Chciałbym odnieść się do sumy(count) produktów sprzedanych w 11 miesiącu.
No to, możesz to w php zliczyć pętlą, albo dać drugie zapytanie coś takiego
SELECT data_zakupu, COUNT(*) FROM zrealizowane WHERE MONTH(data_zakupu)=11 OR MONTH(data_zakupu)=12
CZyli dwa zapytania.
A jakie zadanie będzie spoczywało na tym drugim zapytaniu ??
1 zapytanie będzie umożliwiało dostęp do każdego elementu, a 2 zapytanie będzie wyciągało sumę elementów z 11 miesiąca.
Ok, a jak chciałbym oprócz sumy produktów z 11 miesiąca wyciągnąć sumę także z pozostałych wszystkich jedenastu miesięcy ?
SELECT data_zakupu, COUNT(*) FROM zrealizowane WHERE MONTH(data_zakupu)!=11
SELECT
,sum(case month(data_zakupu)=1 then 1 else 0 end) as styczen
,sum(case month(data_zakupu)=2 then 1 else 0 end) as luty
,sum(case month(data_zakupu)=3 then 1 else 0 end) as marzec
,sum(case month(data_zakupu)=4 then 1 else 0 end) as kwiecien
...
,COUNT(*) calyrok
From zrealizowane WHERE year(data_zakupu)=2015
Pisane bez sprawdzenia, chodzi o pokazanie idei...
A jak się wtedy odnieść do pojedyńczego rekordu ?
Nie rozumiem pytania, to zwróci ci jeden rekord z posumowaniem całego roku, w kolumnach styczen, luty itd.
DODANE:
$view = new VIEW();
$stmt =$this->db->prepare('SELECT
,SUM(CASE WHEN MONTH(data_zakupu)=1 THEN 1 ELSE 0 END) AS styczen
,SUM(CASE WHEN MONTH(data_zakupu)=2 THEN 1 ELSE 0 END) AS luty
,SUM(CASE WHEN MONTH(data_zakupu)=3 THEN 1 ELSE 0 END) AS marzec
,SUM(CASE WHEN MONTH(data_zakupu)=4 THEN 1 ELSE 0 END) AS kwiecien
,SUM(CASE WHEN MONTH(data_zakupu)=5 THEN 1 ELSE 0 END) AS maj
,SUM(CASE WHEN MONTH(data_zakupu)=6 THEN 1 ELSE 0 END) AS czerwiec
,SUM(CASE WHEN MONTH(data_zakupu)=7 THEN 1 ELSE 0 END) AS lipiec
,SUM(CASE WHEN MONTH(data_zakupu)=8 THEN 1 ELSE 0 END) AS siepien
,SUM(CASE WHEN MONTH(data_zakupu)=9 THEN 1 ELSE 0 END) AS wrzesien
,SUM(CASE WHEN MONTH(data_zakupu)=10 THEN 1 ELSE 0 END) AS pazdziernik
,SUM(CASE WHEN MONTH(data_zakupu)=11 THEN 1 ELSE 0 END) AS listopad
,SUM(CASE WHEN MONTH(data_zakupu)=12 THEN 1 ELSE 0 END) AS grudzien
,COUNT(*) calyrok
FROM
zrealizowane
WHERE
YEAR(data_zakupu)=2015');
$row = $stmt->fetch(PDO::FETCH_ASSOC);
echo '<pre>';
echo $row['luty'];
echo '</pre>';
Super, dziękuje.
Mój serwer nie odczytuje instrukcji case, dlatego musiałem to wykonać bez niej, ale wszystko współpracuje :)
Zapomniałem o WHEN w składni, poprawiłem w poscie wyżyej czyli zamiast
SUM(CASE MONTH(data_zakupu)=12 THEN 1 ELSE 0 END) AS grudzien
powinno byc
SUM(CASE WHEN MONTH(data_zakupu)=12 THEN 1 ELSE 0 END) AS grudzien
Podaj adres, prześlę Ci skrzynkę dobrego piwa :)
Wy tak na poważnie???
SELECT MONTH(data_zakupu) miesiac, COUNT(*) ile FROM zrealizowane GROUP BY MONTH(data_zakupu)
i masz każdy miesiąc z sumą
Jeżeli dane liczysz w dziesiątkach tysięcy wpisów to mądrze byłoby też zapisać sobie przeliczone dane historyczne i nie liczyć ich od nowa za każdym razem, bo i tak się już nie zmienią :)