Odejmowanie wyniku jednego zapytania od drugiego

0

Hej,

Sytuacja jest następująca: w PostgreSQL mam dwie tabele, a w nich dwie kolumny, które chciałbym odjąć od siebie (ich wartości). Wykonując poniższe zapytania otrzymuję dwa elementy składowe, brakuje mi tylko wyniku:

SELECT max_participants FROM courses ORDER BY id;

W wyniku tego zapytania, dostaję 6 wierszy z liczbami.

SELECT COUNT(id) FROM participations GROUP BY course_id ORDER BY course_id;

Tutaj dostaję również 6 wierszy, również z liczbami.

Chcę teraz odjąć te zapytania od siebie. Probówałem tak:

SELECT max_participants - (SELECT COUNT(id) FROM participations GROUP BY course_id ORDER BY course_id) FROM courses;

Powyższa próba generuje błąd:

ERROR: more than one row returned by a subquery used as an expression

Pytanie brzmi: czy da się to zrobić w ten sposób? A może istnieje jakiś prostszy sposób podejścia do tego problemu?

0

Hm...Czyli najpierw join dwóch tabel z wybranymi kolumnami, a dopiero później operacja odejmowania na wynikowej tabeli?

0

Zajrzyj do linku. Jest tam podane kilka możliwości. Wraz z uzasadnieniem kiedy które wybrać.

0

OK, dałem radę:

SELECT max_participants - participations AS free_places FROM
(
SELECT max_participants, COUNT(participations.id) AS participations FROM courses
INNER JOIN participations ON participations.course_id = courses.id
GROUP BY courses.max_participants, participations.course_id
ORDER BY participations.course_id
) AS course_places;

Dzięki temu złączeniu wydobywamy tabelki z danymi, na których dokonujemy wybranej operacji i voila.

0

Voila i źle :)

0
Marcin.Miga napisał(a):

Voila i źle :)

Uzasadnisz? :-)

0

Możesz zrobić działanie na zbiorach:

SELECT grupa, sum(wartosc) wynik
FROM
(
SELECT grupa, wartosc FROM tabela1
UNION ALL
SELECT grupa, - wartosc2 FROM tabela2
)
GROUP BY grupa;
0
Marcin.Miga napisał(a):
Lucas83 napisał(a):
Marcin.Miga napisał(a):

Voila i źle :)

Uzasadnisz? :-)

https://dbfiddle.uk/?rdbms=postgres_9.6&fiddle=40820cf976b0c40a5bf6ca07574cd9d4

Hm...nadal nie widzę problemu: ustaliłeś 20 uczestników, zapisałeś 4 uczestników, wolnych miejsc wyszło 16...Oczywiście w moim przykładzie powinienem użyć LEFT zamiast INNER JOIN, żeby uwzględnić kursy, na które nikt się nie zapisał.

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