Sortowanie po miesiący, formatowanie wyniku daty

0

Witam, mam utworzone takie zapytanie

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 :)

0

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

Grupowanie:

GROUP BY YEAR(<tutaj nazwa kolumny typu DATETIME>), MONTH(<tutaj kolumna typu DATETIME>)
0

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

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.

0

Musisz pogrupować tak:

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?

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.

0
 SUM( TimestampDiff(hour,`czasPracy`.`godzinaWyjscia`, `czasPracy`.`godzinaPrzyjscia` ))
0

Znów syntax error

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

0
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...

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

 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ę

#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ć...

1 użytkowników online, w tym zalogowanych: 0, gości: 1