Sortowanie po miesiący, formatowanie wyniku daty

Sortowanie po miesiący, formatowanie wyniku daty
CO
  • Rejestracja: dni
  • Ostatnio: dni
0

Witam, mam utworzone takie zapytanie

Kopiuj
SELECT 
	`czasPracy`.`data`, 
	`pracownicy`.`pracownik`, 
	`pracownicy`.`idPracownicy`, 
	`czasPracy`.`pracownicy_idPracownicy`, 
	`czasPracy`.`godzinaWyjscia`, 
	`czasPracy`.`godzinaPrzyjscia`, 
	SUM( `czasPracy`.`godzinaWyjscia` - `czasPracy`.`godzinaPrzyjscia` ) 
FROM `ansee`.`czasPracy` AS `czasPracy`, 
	`ansee`.`pracownicy` AS `pracownicy` 
WHERE `czasPracy`.`pracownicy_idPracownicy` = `pracownicy`.`idPracownicy` 
GROUP BY `pracownicy`.`pracownik` 
ORDER BY `czasPracy`.`data` ASC, `pracownicy`.`pracownik` ASC 

Prośba jest moja taka, żeby mi ktoś podpowiedział jak pogrupować to również miesiącami bo taka kwerenda jest zupełnie bezużyteczna. Jeszcze jedna sprawa to żeby SUM( czasPracy.godzinaWyjscia - czasPracy.godzinaPrzyjscia ) było sformatowane w typie godzinowym bo dziesiętna reprezentacja jest trudna w użyciu i w sumie nie wiem czy prawidłowa, jeśli da się jakoś zmienić to, również będę wdzięczny :)

Adam Boduch
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 11950
0

Jaka baza danych? Polecam dodac tag do swojego watku - np. mysql, mssql, posgre-sql.

Grupowanie:

Kopiuj
GROUP BY YEAR(<tutaj nazwa kolumny typu DATETIME>), MONTH(<tutaj kolumna typu DATETIME>)
CO
  • Rejestracja: dni
  • Ostatnio: dni
0

Faktycznie nieotagowałem proszę o wybaczenie :)
Chodzi o bazę MySQL
Jeśli to ma być w ten sposób to nie działa

Kopiuj
SELECT 
	`czasPracy`.`data`, 
	`pracownicy`.`pracownik`, 
	`pracownicy`.`idPracownicy`, 
	`czasPracy`.`pracownicy_idPracownicy`, 
	`czasPracy`.`godzinaWyjscia`, 
	`czasPracy`.`godzinaPrzyjscia`, 
	SUM( `czasPracy`.`godzinaWyjscia` - `czasPracy`.`godzinaPrzyjscia` ) 
FROM `ansee`.`czasPracy` AS `czasPracy`, 
	`ansee`.`pracownicy` AS `pracownicy` 
WHERE `czasPracy`.`pracownicy_idPracownicy` = `pracownicy`.`idPracownicy` 
GROUP BY `pracownicy`.`pracownik` 
GROUP BY MONTH `czasPracy`.`data`
ORDER BY `czasPracy`.`data` ASC, `pracownicy`.`pracownik` ASC 

Dostaję syntax error.

Marcin.Miga
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2794
0

Musisz pogrupować tak:

Kopiuj
GROUP BY `pracownicy`.`pracownik` , MONTH(`czasPracy`.`data`)

Tylko pamiętaj, że aby otrzymać prawidłowe wyniki to musisz uwzględnić w wyniku pola, po których grupujesz (chyba że dokładnie wiesz co robisz). MySQL jest głupi i pozwala dać w wyniku inne pola niż w grupowaniu - musisz uważać.

Jeszcze co do wyświetlania wyniku w godzinach. Najlepszym sposobem jest pokazanie wyniku w godzinach. Bo na co zamienisz 123456 godzin?

CO
  • Rejestracja: dni
  • Ostatnio: dni
0

Dobra w takiej postaci ładnie liczy godziny z danego miesiąca. Dzięki
Co do twojego drugiego pytania, to właśnie o to chodzi żeby mieć podaną ilość godzin ale teraz wyświetla mi 8h jako 80000 a 8:15 jako 82500 i nie wiem czy 16h wyświetla jako 160000 czy może jakoś inaczej.

Marcin.Miga
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2794
0
Kopiuj
 SUM( TimestampDiff(hour,`czasPracy`.`godzinaWyjscia`, `czasPracy`.`godzinaPrzyjscia` ))
CO
  • Rejestracja: dni
  • Ostatnio: dni
0

Znów syntax error

Kopiuj
SELECT 
        `czasPracy`.`data`, 
        `pracownicy`.`pracownik`, 
        `pracownicy`.`idPracownicy`, 
        `czasPracy`.`pracownicy_idPracownicy`, 
        `czasPracy`.`godzinaWyjscia`, 
        `czasPracy`.`godzinaPrzyjscia`, 
       	SUM (TIMESTAMPDIFF(HOUR,`czasPracy`.`godzinaWyjscia`,`czasPracy`.`godzinaPrzyjscia`)),
FROM `ansee`.`czasPracy` AS `czasPracy`, 
        `ansee`.`pracownicy` AS `pracownicy` 
WHERE `czasPracy`.`pracownicy_idPracownicy` = `pracownicy`.`idPracownicy` 
GROUP BY `pracownicy`.`pracownik` , MONTH(`czasPracy`.`data`)
ORDER BY `czasPracy`.`data` DESC, `pracownicy`.`pracownik` ASC

syntax error, unexpected $end, expecting BETWEEN or IN or SQL_TOKEN_LIKE

Wersja MySQL: 5.0.51a

Marcin.Miga
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2794
0
Kopiuj
SELECT 

/*        cp.`data`,  
-- nie może być daty - musi byc miesiąc, bo po MIESIĄCU grupujesz
*/
        MONTH(cp.`data`) Miesiac,
        p.`pracownik`, 
        p.`idPracownicy`, 
/*
tu akurat mogą być dwa pola, bo jedno wynika z drugiego (z JOIN), a jedno z nich jest grupowane*/
/*        cp.`pracownicy_idPracownicy`,  -- niepotrzebne - powtórzone */
/*
        cp.`godzinaWyjscia`, 
        cp.`godzinaPrzyjscia`, 
-- tych dwóch pól nie powinno być, bo one wchodzą do agregatu
*/
         SUM (TIMESTAMPDIFF(HOUR,cp.`godzinaWyjscia`,cp.`godzinaPrzyjscia`)) Suma /* wywaliłem przecinek */
FROM `ansee`.`czasPracy` AS cp JOIN `ansee`.`pracownicy` AS p 
ON cp.`pracownicy_idPracownicy` = p.`idPracownicy` 
/*
 zamieniłem na JOIN
i dodałem inne aliasy
*/
GROUP BY p.`pracownik` , MONTH(cp.`data`)
ORDER BY cp.`data` DESC, p.`pracownik` ASC

Pisałem Ci, byś uważał z grupowaniem. Chyba nie wiesz co zapytanie ma zwracać, a co zwraca...

CO
  • Rejestracja: dni
  • Ostatnio: dni
0

Nadmiarowość danych wynikała z stopniowego budowania zapytania i generowania go z Open Offica dopiero później zacząłem dostosowywać go do swoich potrzeb. Wyciąłem komentarz i przystosowałem do obsługi OO :P

Kopiuj
 SELECT 
 
        MONTH(`czasPracy`.`data`) Miesiac,
        `pracownicy`.`pracownik`, 
        `pracownicy`.`idPracownicy`,
	`czasPracy`.`pracownicy_idPracownicy`,

         SUM (TIMESTAMPDIFF(HOUR,`czasPracy`.`godzinaWyjscia`,`czasPracy`.`godzinaPrzyjscia`)),
FROM `ansee`.`czasPracy` AS `cp` JOIN `ansee`.`pracownicy` AS `p` 
ON `cp`.`pracownicy_idPracownicy` = `p`.`idPracownicy` ,

GROUP BY `p`.`pracownik` , MONTH(`cp`.`data`),
ORDER BY `cp`.`data` DESC, `p`.`pracownik` ASC,

Niestety otrzymuję

Kopiuj
#1064 - Something is wrong in your syntax obok '(HOUR,`czasPracy`.`godzinaWyjscia`,`czasPracy`.`godzinaPrzyjscia`)),
FROM `ansee' w linii 9  

Coś tam kombinowałem i ciekawe jest to że jak usunę jakąś linię wcześniej to dalej jest błąd w lini 9 która jest już inna, nie mam pojęcia o co może chodzić...

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.