Bernard B.

Bernard B. "IT man" ;)

Temat: problemik - koty

A może by tak małe zadanko?
Ciekawe jak coś takiego będzie wyglądało w różnych bazach danych i ile różnych zapytań spełnijących zadanie można wymyślić w ramach jednej bazy danych :)

Mamy 2 tabele.
Pierwsza:
nazwa: koty
kolumny: id_kota( int, autoincrement), rasa( varchar 50), imie (varchar 50)

Druga:
nazwa: posilki
kolumny: id_posilku ( int, autoincrement), id_kota( int, klucz obcy), czas_wydania(datetime), ilosc_karmy (int) -- czyli ile sierściuch zeżarł :)

Naszym zadaniem jest napisanie dokładnie jednego zapytania SQL ( bez funkcji składowanych, języków skryptowych itp) które dawałoby recordSet o nastepujących kolumnach:

rasa( sortowane ASC), imie(ASC), suma

gdzie 'suma' jest sumą spożytej karmy przez danego kota w bieżącym miesiącu (w miesiącu w którym zadajemy pytanie)

Jak wrócę z urlopu podam 2 rozwiązania dla T-SQL (MSSQL)
Jacek Ołowiak

Jacek Ołowiak kierownik zespołu IT

Temat: problemik - koty

Bernard B.:
A może by tak małe zadanko?
Ciekawe jak coś takiego będzie wyglądało w różnych bazach danych i ile różnych zapytań spełnijących zadanie można wymyślić w ramach jednej bazy danych :)

Mamy 2 tabele.
Pierwsza:
nazwa: koty
kolumny: id_kota( int, autoincrement), rasa( varchar 50), imie (varchar 50)

Druga:
nazwa: posilki
kolumny: id_posilku ( int, autoincrement), id_kota( int, klucz obcy), czas_wydania(datetime), ilosc_karmy (int) -- czyli ile sierściuch zeżarł :)

Naszym zadaniem jest napisanie dokładnie jednego zapytania SQL ( bez funkcji składowanych, języków skryptowych itp) które dawałoby recordSet o nastepujących kolumnach:

rasa( sortowane ASC), imie(ASC), suma

gdzie 'suma' jest sumą spożytej karmy przez danego kota w bieżącym miesiącu (w miesiącu w którym zadajemy pytanie)

Jak wrócę z urlopu podam 2 rozwiązania dla T-SQL (MSSQL)

tak na bardzo szybko:

select
K.RASA,
K.IMIE,
sum(P.ILOSC_KARMY) as ilosc,
to_char(P.CZAS_WYDANIA, 'yyyy-mm') as data
from
KOTY K LEFT OUTER JOIN POSILKI P
ON K.ID_KOTA = P.ID_KOTA
WHERE to_char(P.CZAS_WYDANIA, 'yyyy-mm') LIKE SYSDATE% :>
group by
to_char(P.CZAS_WYDANIA, 'yyyy-mm')
ORDER BY
K.RASA ASC,
K.IMIE ASC
Tomasz Poradowski

Tomasz Poradowski Specjalista od
wytwarzania
oprogramowania

Temat: problemik - koty

Tak z ciekawości - to zadanie pochodzi z jakiejś książki? Widziałem już coś takiego o kotach na studiach kilka lat temu... ;)Tomasz Poradowski edytował(a) ten post dnia 31.08.07 o godzinie 16:31
Jacek Ołowiak

Jacek Ołowiak kierownik zespołu IT

Temat: problemik - koty

Tomasz P.:
Tak z ciekawości - to zadanie pochodzi z jakiejś książki? Widziałem już coś takiego o kotach na studiach kilka lat temu... ;)Tomasz Poradowski edytował(a) ten post dnia 31.08.07 o godzinie 16:31
koty, ptaszki, zwierzeta ogólnie , db, c, c++ na uczelniach są same taki bzdury

a to na górze to chyba spieprzyłem strasznie... ale piatek jest, nie mam weny zeby analizowac

konto usunięte

Temat: problemik - koty

Bernard B.:
<ciach>
Naszym zadaniem jest napisanie dokładnie jednego zapytania SQL ( bez funkcji składowanych, języków skryptowych itp) które dawałoby recordSet o nastepujących kolumnach:

rasa( sortowane ASC), imie(ASC), suma

gdzie 'suma' jest sumą spożytej karmy przez danego kota w bieżącym miesiącu (w miesiącu w którym zadajemy pytanie)

No skoro piszesz o dwoch rozwiazaniach, to pewnie masz na mysli raz uzycie WHERE, a drugi raz uzycie HAVING, nieprawdaz?

Poniżej 2 rozwiązania napisane w T-SQLu:

Rozwiazanie nr 1:
SELECT
rasa.k 'Rasa',
imie.k 'Imie',
ISNULL(SUM(ilosc_karmy), 'Kot nic nie jadł') 'Ilosc karmy'

FROM
koty k INNER JOIN posilki p
ON k.id_kota = p.id_kota

WHERE
DATEPART(m, czas_wydania.p) = DATEPART(m, GETDATE())

GROUP BY
rasa.k, imie.k

ORDER BY
1 ASC, 2 ASC

Rozwiazanie nr 2:
SELECT
rasa.k 'Rasa',
imie.k 'Imie',
ISNULL(SUM(ilosc_karmy), 'Kot nic nie jadł') 'Ilosc karmy'

FROM
koty k INNER JOIN posilki p
ON k.id_kota = p.id_kota

GROUP BY
rasa.k, imie.k

HAVING
DATEPART(m, czas_wydania.p) = DATEPART(m, GETDATE())

ORDER BY
1 ASC, 2 ASC

Starczy na dziś kontaktu z maszyną :)
Pozdrawiam
Paweł

Temat: problemik - koty

postgres 8.x

SELECT rasa,imie, SUM(ilosc_karmy) FROM koty AS K
JOIN posilki AS P ON (P.id_kota = K.id)
WHERE select datetime >= select EXTRACT(year from CURRENT_DATE) || '-' || EXTRACT(month from CURRENT_DATE) || '-0'
GROUP BY rasa,imie
ORDER BY rasa ASC, imie ASC
Łukasz B.

Łukasz B. Menedżer ds Analiz
Biznesowych

Temat: problemik - koty

Paweł K.:
Bernard B.:
<ciach>
Rozwiazanie nr 2:
SELECT
rasa.k 'Rasa',
imie.k 'Imie',
ISNULL(SUM(ilosc_karmy), 'Kot nic nie jadł') 'Ilosc karmy'

FROM
koty k INNER JOIN posilki p
ON k.id_kota = p.id_kota

GROUP BY
rasa.k, imie.k

HAVING
DATEPART(m, czas_wydania.p) = DATEPART(m, GETDATE())

ORDER BY
1 ASC, 2 ASC

The column prefix 'rasa' does not match with a table name or alias name used in the query.

Column 'p.czas_wydania' is invalid in the HAVING clause because it is not contained in either an aggregate function or the GROUP BY clause.

Pozdrowienia
Łukasz
Marcin K.

Marcin K. Lead Software
Engineer, Tieto
Polska

Temat: problemik - koty

to ja podam rozwiązanie dla Pervasive 9.x

select k.rasa,k.imie,sum(p.ilosc) 'Ilość zżarta' from "koty" k
inner join "posilki" p on k.id_kota=p.id_kota
where EXTRACT(YEAR,p.czas_wydania)*12
+EXTRACT(MONTH,p.czas_wydania)-1
=EXTRACT(YEAR,NOW())*12+EXTRACT(MONTH,NOW())-1
group by k.rasa,k.imie
order by k.rasa ASC,k.imie ASC

Pozdrawiam

konto usunięte

Temat: problemik - koty

Łukasz B.:
Paweł Kiraga:
Rozwiazanie nr 2:
SELECT
rasa.k 'Rasa',
imie.k 'Imie',
ISNULL(SUM(ilosc_karmy), 'Kot nic nie jadł') 'Ilosc karmy'

FROM
koty k INNER JOIN posilki p
ON k.id_kota = p.id_kota

GROUP BY
rasa.k, imie.k

HAVING
DATEPART(m, czas_wydania.p) = DATEPART(m, GETDATE())

ORDER BY
1 ASC, 2 ASC

The column prefix 'rasa' does not match with a table name or alias name used in the query.

Column 'p.czas_wydania' is invalid in the HAVING clause because it is not contained in either an aggregate function or the GROUP BY clause.

Racja racja. Pisana 'na kolanie', nie sparsowane nawet...
Podales tylko komunikaty, wiec dam krotki komentarz uzupelniajacy.
Obydwa zapytania nie mialy szans sie poprawnie uruchomic, poniewaz w sekcji SELECT zle byly zapisane pola (rasa.k zamiast k.rasa). ISNULL nie konwertowalo argumentu na tekst, wiec w przypadku NULLa dawalo blad.
W sekcji GROUP BY nie bylo DATEPART(m, czas_wydania.p).

Poniżej rozwiazanie z HAVINGiem:
SELECT
k.rasa 'Rasa',
k.imie 'Imie',
isnull(sum(p.ilosc_karmy), 0) 'Ilosc karmy'

FROM
koty k INNER JOIN posilki p
ON k.id_kota = p.id_kota

GROUP BY
k.rasa, k.imie, DATEPART(m, p.czas_wydania)

HAVING
DATEPART(m, p.czas_wydania) = DATEPART(m, GETDATE())

ORDER BY
1 ASC, 2 ASC

oraz z WHEREm:
SELECT
k.rasa 'Rasa',
k.imie 'Imie',
isnull(sum(p.ilosc_karmy), 0) 'Ilosc karmy'

FROM
koty k INNER JOIN posilki p
ON k.id_kota = p.id_kota

WHERE
DATEPART(m, p.czas_wydania) = DATEPART(m, GETDATE())

GROUP BY
k.rasa, k.imie

ORDER BY
1 ASC, 2 ASC

pozdrowienia
Pawel

Następna dyskusja:

Problemik z zapytaniem SQL :)




Wyślij zaproszenie do