Dane z dwóch róznych tabel

0

Witam.
Mam dwie tabele z wieloma kolumnami. Na potrzeby zapytania ograniczyłem je do dwóch kolumn.
W pierwszej tabeli mam datę i czas zakończenia wstępnej producji, w drugiej tabeli datę oraz czas zakończenia produkcji. Zależy mi na tym aby wyświetlić w tabeli:
|DATA|ZAKONCZENIE WSTEPNEJ PRODUKCJI|ZAKOŃCZENIE PRODUKCJI|

Przykładowe dane: (czas jest jako TEXT gdyż z róznych powodów tak musi być)

CREATE TABLE reports_2023 (
  `filling_finish_time` TEXT,
  `filling_date` DATE
);

INSERT INTO reports_2023
  (`filling_finish_time`, `filling_date`)
VALUES
  ('1', '07:05:00',2023-04-01),
  ('2', '06:55:00', 2023-04-05);

CREATE TABLE scans_2023 (
  `time` TEXT,
  `date` DATE
);

INSERT INTO scans_2023
  (`date`, `time`)
VALUES
  ('1', 2023-04-01, '13:23:00'),
  ('2', 2023-04-05, '17:00:00');

Czy ktoś mógłby mi jak "tumanowi" pokazać jak to zrobić?

link do fiddle: link

3

https://www.db-fiddle.com/f/i7F4WDgZGRqSYrXetfZsBW/0
Poprawiłem ci troche zapytania, bo nawet nie sprawdziłeś, czy się dane wrzucaja do tabel

0
INSERT INTO scans_2023
  (`date`, `time`)
VALUES
  ('1', 2023-04-01, '13:23:00'),
  ('2', 2023-04-05, '17:00:00');

Tak trochę nie bardzo wciskać trzy wartości do dwóch pól...
No i oczywiście standardowo - szukałeś i nigdzie nie było... https://www.google.com/search?q=sql+join+two+tables
czy też w rodzimym języku https://www.google.com/search?q=sql+%C5%82%C4%85czenie+dw%C3%B3ch+tabel

0

Przykładowe dane: (czas jest jako TEXT gdyż z róznych powodów tak musi być)

Nie musi i nie powinno tak być. Możesz robić. CAST w jedną i drugą stronę.
Jak potem dojdzie Ci np. obliczyć czas produkcji poprzez różnicę między datą startu a końcem produkcji to będzie problem.

0

@jurek1980 Czas produkcji jest jest obliczany przez zewnętrzną aplikację poprzez wczytywanie stringów z bazy i w programie są one zamieniane na czas. Tego nie zmienię więc musi tak zostać.
@abrakadaber Co do przykładowych danych to wklejone w pośpiechu, przepraszam. Zanim zapytałem na forum szukałem w google. Jest dużo przykładów ale większość jest dla mnie niezrozumiała, gdyż nie odnosi się do różnych nazw kolumn w obu tabelach. Być może źle patrzyłem. Miałem nadzieje, że na forum otrzymam pomoc.

Teraz dostałem info "z góry", że problem jest bardziej skomplikowany gdyż dochodzi jeszcze dwie kolumny - numer linii i kod produktu. Kody produktów nie mają być wyświetlane. Służą tylko do rozróżnienia produkcji.
Czas zakończenia wstępnej produkcji jest dodawany przy generowaniu raportu, czas zakończenia produkcji jest czasem zeskanowania ostatniej palety danego produktu. Produktów może być więcej niż jeden na każdej linii w danym dniu.
Więc z każdego dnia powinno to wyglądać np:

| DATA (tabela raportów) | NUMER LINII (tabela raportów) | ZAKOŃCZENIE WSTĘPNEJ PRODUKCJI (tabela raportów) | ZAKOŃCZENIE PRODUKCJI (tabela produkcji) |
| 2023-04-27 | 1 | 10:59:00 | 13:40:00 |
| 2023-04-27 | 1 | 12:30:00 | 16:43:00 |
| 2023-04-27 | 2 | 09:00:00 | 11:39:00 |
| 2023-04-27 | 1 | 10:59:00 | 13:40:00 |

W tabeli produkcji, kolumny mają nazwy: prod_code (kod produktu),date (data produkcji), line (linia), time (czas zeskanowania palety)
W tabeli produkcji: uid (kod produktu), filling_date, filling_finish_time, line_number

Czy mogę liczyć na pomoc?

0

Uwaga ogólna: im mniej precyzyjnie opiszesz problem, tym mniejsza szansa, że ktoś Ci pomoże. Posługujesz się pojęciami, które dla osoby nie znającej meritum, są zbyt ogólne.

W pierwszej tabeli mam datę i czas zakończenia wstępnej producji, w drugiej tabeli datę oraz czas zakończenia produkcji. Zależy mi na tym aby wyświetlić w tabeli:
|DATA|ZAKONCZENIE WSTEPNEJ PRODUKCJI|ZAKOŃCZENIE PRODUKCJI|

Data z pierwszej kolumny to data czego?

Teraz dostałem info "z góry", że problem jest bardziej skomplikowany gdyż dochodzi jeszcze dwie kolumny - numer linii i kod produktu. Kody produktów nie mają być wyświetlane. Służą tylko do rozróżnienia produkcji.

Co to znaczy "rozróżnienie produkcji"? Ja rozumiem, że można rozróżnić partię produkcji, określić czas produkcji, serię produkcji.

Czas zakończenia wstępnej produkcji jest dodawany przy generowaniu raportu, czas zakończenia produkcji jest czasem zeskanowania ostatniej palety danego produktu. Produktów może być więcej niż jeden na każdej linii w danym dniu.
Więc z każdego dnia powinno to wyglądać np:

| DATA (tabela raportów) | NUMER LINII (tabela raportów) | ZAKOŃCZENIE WSTĘPNEJ PRODUKCJI (tabela raportów) | ZAKOŃCZENIE PRODUKCJI (tabela produkcji) |
| 2023-04-27 | 1 | 10:59:00 | 13:40:00 |
| 2023-04-27 | 1 | 12:30:00 | 16:43:00 |
| 2023-04-27 | 2 | 09:00:00 | 11:39:00 |
| 2023-04-27 | 1 | 10:59:00 | 13:40:00 |
W tabeli produkcji, kolumny mają nazwy: prod_code (kod produktu),date (data produkcji), line (linia), time (czas zeskanowania palety)
W tabeli produkcji: uid (kod produktu), filling_date, filling_finish_time, line_number

Jak zostawiasz taki opis, to (przynajmniej ja) zachodzę w głowę, dlaczego to jest w dwóch linijkach - czy opisujesz tabelę produkcji, ale sam opis rozbiłeś na 2 linijki, czy też może pomyliłeś się w nazwach.

Zrób jeszcze raz, na spokojnie, przykład w db-fiddle lub rozpisz przykładowe dane wejściowe i to, co chcesz uzyskać w efekcie, a niemal na pewno dostaniesz pomoc.
Jakie dane masz w jakie tabeli, co ma być kryterium, po którym będzie można jednoznacznie zidentyfikować, który wiersz z tabeli A ma być połączony z którym z tabeli B.

0
Los Bomberos napisał(a):

Uwaga ogólna: im mniej precyzyjnie opiszesz problem, tym mniejsza szansa, że ktoś Ci pomoże. Posługujesz się pojęciami, które dla osoby nie znającej meritum, są zbyt ogólne.

W pierwszej tabeli mam datę i czas zakończenia wstępnej producji, w drugiej tabeli datę oraz czas zakończenia produkcji. Zależy mi na tym aby wyświetlić w tabeli:
|DATA|ZAKONCZENIE WSTEPNEJ PRODUKCJI|ZAKOŃCZENIE PRODUKCJI|

Data z pierwszej kolumny to data czego?

Data raportu,

Teraz dostałem info "z góry", że problem jest bardziej skomplikowany gdyż dochodzi jeszcze dwie kolumny - numer linii i kod produktu. Kody produktów nie mają być wyświetlane. Służą tylko do rozróżnienia produkcji.

Co to znaczy "rozróżnienie produkcji"? Ja rozumiem, że można rozróżnić partię produkcji, określić czas produkcji, serię produkcji.

Na jednej linii są różne produkty rozróżniane po kodzie produktu,

Czas zakończenia wstępnej produkcji jest dodawany przy generowaniu raportu, czas zakończenia produkcji jest czasem zeskanowania ostatniej palety danego produktu. Produktów może być więcej niż jeden na każdej linii w danym dniu.
Więc z każdego dnia powinno to wyglądać np:

| DATA (tabela raportów) | NUMER LINII (tabela raportów) | ZAKOŃCZENIE WSTĘPNEJ PRODUKCJI (tabela raportów) | ZAKOŃCZENIE PRODUKCJI (tabela produkcji) |
| 2023-04-27 | 1 | 10:59:00 | 13:40:00 |
| 2023-04-27 | 1 | 12:30:00 | 16:43:00 |
| 2023-04-27 | 2 | 09:00:00 | 11:39:00 |
| 2023-04-27 | 1 | 10:59:00 | 13:40:00 |
W tabeli produkcji, kolumny mają nazwy: prod_code (kod produktu),date (data produkcji), line (linia), time (czas zeskanowania palety)
W tabeli produkcji: uid (kod produktu), filling_date, filling_finish_time, line_number

Jak zostawiasz taki opis, to (przynajmniej ja) zachodzę w głowę, dlaczego to jest w dwóch linijkach - czy opisujesz tabelę produkcji, ale sam opis rozbiłeś na 2 linijki, czy też może pomyliłeś się w nazwach.

Przepraszam. Miało być: W tabeli raportów: uid (kod produktu), filling_date, filling_finish_time, line_number

Zrób jeszcze raz, na spokojnie, przykład w db-fiddle lub rozpisz przykładowe dane wejściowe i to, co chcesz uzyskać w efekcie, a niemal na pewno dostaniesz pomoc.

Jakie dane masz w jakie tabeli, co ma być kryterium, po którym będzie można jednoznacznie zidentyfikować, który wiersz z tabeli A ma być połączony z którym z tabeli B.

| filling_date z tabeli raportów| line_number z tabeli raportów |filling_finish_time z tabeli raportów | time (czas zeskanowania ostatniej palety danego produktu) z tabeli produkcji) |
| 2023-04-27 | 1 | 10:59:00 | 13:40:00 |
| 2023-04-27 | 1 | 12:30:00 | 16:43:00 |
| 2023-04-27 | 2 | 09:00:00 | 11:39:00 |
| 2023-04-27 | 1 | 10:59:00 | 13:40:00 |

tabela produkcji to: scans_2023
tabela raportów to: reports_2023

przykład na fiddle: link

0
wala10 napisał(a):

(...)

przykład na fiddle: link

Lepiej:)

Czy w na danej linii w danym dniu produkt (identyfikowany przez uid/prod_code) może pojawić się więcej, niż raz?
Czy data filling_finish_time może wypaść w innym dniu, niż data z tabeli scans_2023?

Najprostsza wersja, która zakłada, że w danym dniu na danej linii produkt o danym uid pojawia się raz i że napełnienie (filling_date) następuje w tym samym dniu, co skanowanie:

select 
  reports_2023.`filling_date`, 
  reports_2023.`line_number`,
  reports_2023.`filling_finish_time`,
  scans_2023.`time`
       
from reports_2023
join scans_2023
  on reports_2023.`line_number` = scans_2023.`line` and
     reports_2023.`uid` = scans_2023.`prod_code` and
     reports_2023.`filling_date` = scans_2023.`date`

Ale to zapytanie trzeba przerobić, jeśli któreś z założeń nie jest spełnione.
Np. co w sytuacji:
reports_2023

id line_number filling_finish_time uid filling_date
1 1 01:01:00 444 2023-04-01
2 1 03:01:00 444 2023-04-01
3 1 23:59:00 444 2023-04-01
4 1 00:10:00 444 2023-04-02

scans_2023

id line date prod_code time
5 1 04:01:00 444 2023-04-01
6 1 05:01:00 444 2023-04-01
7 1 01:00:00 444 2023-04-02

Czy zakładasz, że dla wiersza z id=3 z tabeli reports ma się dopasować wiersz z id=7 z tabeli scans? Bo to "pierwsze" czasowo wystąpienie skanowania po zakończeniu napełniania (czyli skończyliśmy napełniać o 23:59, a pierwszy skan nastąpił o 01:00 następnego dnia).

0
Los Bomberos napisał(a):
wala10 napisał(a):

(...)

przykład na fiddle: link

Lepiej:)

Czy w na danej linii w danym dniu produkt (identyfikowany przez uid/prod_code) może pojawić się więcej, niż raz?

Nie wiem czy dobrze rozumiem pytanie. Uid nie, prod_code tak ponieważ znajduje się tam każda zeskanowana paleta a ich może być wiele.

Czy data filling_finish_time może wypaść w innym dniu, niż data z tabeli scans_2023?

Nie. Nowy dzień to nowy batch i oczywiście nowa data.

Najprostsza wersja, która zakłada, że w danym dniu na danej linii produkt o danym uid pojawia się raz i że napełnienie (filling_date) następuje w tym samym dniu, co skanowanie:

select 
  reports_2023.`filling_date`, 
  reports_2023.`line_number`,
  reports_2023.`filling_finish_time`,
  scans_2023.`time`
       
from reports_2023
join scans_2023
  on reports_2023.`line_number` = scans_2023.`line` and
     reports_2023.`uid` = scans_2023.`prod_code` and
     reports_2023.`filling_date` = scans_2023.`date`

Ale to zapytanie trzeba przerobić, jeśli któreś z założeń nie jest spełnione.
Np. co w sytuacji:
reports_2023

id line_number filling_finish_time uid filling_date
1 1 01:01:00 444 2023-04-01
2 1 03:01:00 444 2023-04-01
3 1 23:59:00 444 2023-04-01
4 1 00:10:00 444 2023-04-02

scans_2023

id line date prod_code time
5 1 04:01:00 444 2023-04-01
6 1 05:01:00 444 2023-04-01
7 1 01:00:00 444 2023-04-02

Czy zakładasz, że dla wiersza z id=3 z tabeli reports ma się dopasować wiersz z id=7 z tabeli scans? Bo to "pierwsze" czasowo wystąpienie skanowania po zakończeniu napełniania (czyli skończyliśmy napełniać o 23:59, a pierwszy skan nastąpił o 01:00 następnego dnia).

Produkcja zawsze jest w tym samym dniu co napełnianie.

Dziękuje za pomoc i naprowadzenie na tor postępowania. Temat można zamknąć.

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