GROUP BY dwie tabele

0

Witam!

Mam pytanko.

Posiadam tabele appt (do awizacji)
id_awizacja | data_aw | kanal | kod

Posiadam następujące wpisy:
1 | 2018-12-16 | PBL | Komorniki
2 | 2018-12-16 | PBS | Teresin

Druga tabela dane:
id_dane | value

1 | Komorniki
2 | Teeresin
3 | Galanta
4 | Niezaawizowane

Pierwsza tabela zawiera wszystkie awizację jakie posiadam w bazie (appt.kod=dane.value).
W drugiej tabeli zawieram wszystkie kody jakie występują dotyczące awizacji: Komorniki,Teresin,Galanta,Niezaawizowane.

Jeżeli zrobię zapytanie:

select kod, count(*) from appt group by kod

to wyskoczy mi rezultat:

Komorniki 1
Teresin 1

a chciałbym uzyskać rezultat:

Komorniki 1
Teresin 1
Galanta 0
Niezaawizowane 0

żeby sortowało po wszystkich dostępnych 'kodach', a jeżlei nie występują one w tabeli appt to pokazywało "0", a nie pomijało wartość

select appt.kod, count(*) from appt,dane where appt.kod=dane.value group by dane.value

Ale nie pokazuje poprawnie. Jak zmodyfikować to zapytanie żeby grupowało tabele appt.kod po wszystkich wartościach z tabeli dane.value

1

Połącz obie tabele left joinem i dopiero zgrupuj:

select
  dane.value, COUNT(1)
from
  dane left join appt on appt.kod=dane.value
group by
  dane.value

Bez sprawdzenia pisane na kolanie. Ale powinieneś widzieć jak to działa.

EDIT

Ok po przemyśleniu to nie zadziała poprawnie. Szkoda, że nie dałeś ddl tabel czy nawet linka do sqlfiddle. Zatem można użyć chociażby CTE:

witch CTE_TEMP as (
  SELECT kod, COUNT(*) FROM appt GROUP BY kod
)
select
  *
from
  dane left join CTE_TEMP on dane.value = CTE_TMEP.kod
0
Mr.YaHooo napisał(a):

Połącz obie tabele left joinem i dopiero zgrupuj:

select
  dane.value, COUNT(1)
from
  dane left join appt on appt.kod=dane.value
group by
  dane.value

Bez sprawdzenia pisane na kolanie. Ale powinieneś widzieć jak to działa.

EDIT

Ok po przemyśleniu to nie zadziała poprawnie. Szkoda, że nie dałeś ddl tabel czy nawet linka do sqlfiddle. Zatem można użyć chociażby CTE:

witch CTE_TEMP as (
  SELECT kod, COUNT(*) FROM appt GROUP BY kod
)
select
  *
from
  dane left join CTE_TEMP on dane.value = CTE_TMEP.kod

niby działa, ale jak dopisałem do tabeli dane.value 'Opakowania', a takiego kodu nie ma w tabeli appt to wyszukuje mi :
Opakowania 1
a powinno być 0 ;)

a co oznacza ta klauzra CTE??

1

CTE to nie klauzula, po prostu nazwa danego mechanizmu https://www.sqlpedia.pl/cte-common-table-expressions/ który jest dość pomocny i często zwiększa czytelność zapytań.

Co do Twojego drugiego pytania pokaż dokładnie jakie masz dane wejściowe i co nie gra, bo ciężko tak się rozmawia.

0
Mr.YaHooo napisał(a):

CTE to nie klauzula, po prostu nazwa danego mechanizmu https://www.sqlpedia.pl/cte-common-table-expressions/ który jest dość pomocny i często zwiększa czytelność zapytań.

Co do Twojego drugiego pytania pokaż dokładnie jakie masz dane wejściowe i co nie gra, bo ciężko tak się rozmawia.

Posiadam tabele appt (do awizacji)
id_awizacja | data_aw | kanal | kod

Posiadam następujące wpisy:
1 | 2018-12-16 | PBL | Komorniki
2 | 2018-12-16 | PBS | Teresin
3 | 2018-12-16 | PBS | Galanta
4 | 2018-12-16 | PBS | Niezaawizowane
5 | 2018-12-16 | PBS | Spóźnione
6 | 2018-12-16 | PBS | Komorniki

Druga tabela dane:
id_dane | value

1 | Komorniki
2 | Teeresin
3 | Galanta
4 | Niezaawizowane
5 | Spóźnione
6 | Opakowania

SELECT
  dane.VALUE, COUNT(1)
FROM
  dane LEFT JOIN appt ON appt.kod=dane.VALUE
GROUP BY
  dane.VALUE

Wychodzi mi
Komorniki 2
Teresin 1
Galanta 1
Niezaawizowane 1
Spóźnione 1
Opakowania 1

a Opakowania nie ma w tabeli appt ;), a pokazuje 1. Powinno być:

Komorniki 2
Teresin 1
Galanta 1
Niezaawizowane 1
Spóźnione 1
Opakowania 0

0
mariuszkoralczyk napisał(a):
Mr.YaHooo napisał(a):

CTE to nie klauzula, po prostu nazwa danego mechanizmu https://www.sqlpedia.pl/cte-common-table-expressions/ który jest dość pomocny i często zwiększa czytelność zapytań.

Co do Twojego drugiego pytania pokaż dokładnie jakie masz dane wejściowe i co nie gra, bo ciężko tak się rozmawia.

Posiadam tabele appt (do awizacji)
id_awizacja | data_aw | kanal | kod

Posiadam następujące wpisy:
1 | 2018-12-16 | PBL | Komorniki
2 | 2018-12-16 | PBS | Teresin
3 | 2018-12-16 | PBS | Galanta
4 | 2018-12-16 | PBS | Niezaawizowane
5 | 2018-12-16 | PBS | Spóźnione
6 | 2018-12-16 | PBS | Komorniki

Druga tabela dane:
id_dane | value

1 | Komorniki
2 | Teeresin
3 | Galanta
4 | Niezaawizowane
5 | Spóźnione
6 | Opakowania

SELECT
  dane.VALUE, COUNT(1)
FROM
  dane LEFT JOIN appt ON appt.kod=dane.VALUE
GROUP BY
  dane.VALUE

Wychodzi mi
Komorniki 2
Teresin 1
Galanta 1
Niezaawizowane 1
Spóźnione 1
Opakowania 1

a Opakowania nie ma w tabeli appt ;), a pokazuje 1. Powinno być:

Komorniki 2
Teresin 1
Galanta 1
Niezaawizowane 1
Spóźnione 1
Opakowania 0

Mój błąd ;):) Działa poprawnie ;)

Ost pytanie :)

**> Posiadam tabele appt (do awizacji)

id_awizacja | data_awizacja | kanal | kod

Posiadam następujące wpisy:
1 | 2018-12-16 | PBL | Komorniki
2 | 2018-12-16 | PBS | Teresin
3 | 2018-12-16 | PBS | Galanta
4 | 2018-12-16 | PBS | Niezaawizowane
5 | 2018-12-16 | PBS | Spóźnione
6 | 2018-12-16 | PBS | Komorniki**

**> Druga tabela dane:

id_dane | value

1 | Komorniki
2 | Teeresin
3 | Galanta
4 | Niezaawizowane
5 | Spóźnione
6 | Opakowania**

**3 tabela data_aw
idd | aw_data | login

1 | 2018-12-12 | michal
2 | 2018-12-13 | marta**

ost tabela to data awizacji przypisana do loginu:

appt.data_awizacja=data_aw.aw_data

SELECT count(appt.kod) FROM dane LEFT JOIN appt LEFT JOIN data_aw ON appt.kod=dane.value ON appt.data_awizacja=data_aw.aw_data AND data_aw.login='$login' GROUP BY dane.value

ALe nie działa pewnie gdzieś składnia jest nie taka... mógłbyś rzucić okiem :)?

appt.data_awizacja=data_aw.aw_data

appt.kod=dane.value

2

Problemem jest ta 1 w count.
wystarczy zliczać nie nullowe wartości:

SELECT
  dane.VALUE, COUNT(appt.kod)
FROM
  dane LEFT JOIN appt ON appt.kod=dane.VALUE
GROUP BY
  dane.VALUE
0
Panczo napisał(a):

Problemem jest ta 1 w count.
wystarczy zliczać nie nullowe wartości:

SELECT
  dane.VALUE, COUNT(appt.kod)
FROM
  dane LEFT JOIN appt ON appt.kod=dane.VALUE
GROUP BY
  dane.VALUE

Działa ;) a masz może pomysł na dalsze rozwiązanie pomysłu ;) żeby połączyć trzy tabele ;)

1

Składnia joina niepoprawna:

SELECT
  dane.VALUE, COUNT(data_aw.login)
FROM
  dane 
  LEFT JOIN appt ON appt.kod=dane.VALUE
  LEFT JOIN data_aw ON appt.data_awizacja=data_aw.aw_data AND data_aw.login='michal'
GROUP BY
  dane.VALUE

http://sqlfiddle.com/#!9/1e40bc/1

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