Wyświetlenie danych w jednej linii dla tego samego ID

Wyświetlenie danych w jednej linii dla tego samego ID
RL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0

Witajcie.
Posiadam kilka tabel które łącze w jedne zapytanie które daje mi taką odpowiedź:
odczyty.jpg

Chciałbym się zapytać czy istnieje stworzenie takiego zapytania aby dla elementu o tym samym ID wyświetlić czas w jednej linii ? W kolumnie Odczyt jest zmienna mówiąca który to odczyt. I tych odczytów może być więcej niż 2. Na zdjęciu przedstawiłem uproszczoną wersję.

Uproszczony przykładowy wygląd pierwszej tabeli:
ID--- Pole 1----- Pole 2

Druga tabela:
ID--- Czas ---- Odczyt

ID w pierwszej tabeli to ID z drugiej tabeli

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10252
0

Coś takiego?

Kopiuj
SELECT ID, array_agg(Czas), array_agg("Odczyt 1") AS Czasy
GROUP BY ID;
Marius.Maximus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2229
1

zawsze warto podać jaki silnik SQL używasz bo nie wszystkie bazy maja te same możliwości

FA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 223
1
Riddle napisał(a):

Coś takiego?

Kopiuj
SELECT ID, array_agg(Czas), array_agg("Odczyt 1") AS Czasy
GROUP BY ID;

Podejrzewam, że autorowi chodziło o pivot, a pracuje chyba w MS SQL (zrzut ekranu przypomina SSMS).

Jeśli chcesz, żeby poszczególne odczyty były w jednej kolumnie (po przecinku), rozwiązanie @Riddle będzie dobre, ale w zależności od silnika musisz użyć różnych instrukcji (dla MS SQL będzie to STRING_AGG).

Jeśli chcesz, żeby poszczególne odczyty były w kolejnych kolumnach, musisz zainteresować się PIVOTem, ale zmartwię Cię na samym początku - w MS SQL (nie wiem, jak w innych silnikach) musisz na wstępie określić, ile tych kolumn (odczytów) będzie. Napisałeś, że więcej, niż 2. Jeśli znasz maksymalną ich liczbę, to pół problemu.

Ale zacznij od dokładnego określenia potrzeb i wskazania bazy, na której pracujesz.

RL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0
Fac napisał(a):
Riddle napisał(a):

Coś takiego?

Kopiuj
SELECT ID, array_agg(Czas), array_agg("Odczyt 1") AS Czasy
GROUP BY ID;

Podejrzewam, że autorowi chodziło o pivot, a pracuje chyba w MS SQL (zrzut ekranu przypomina SSMS).

Jeśli chcesz, żeby poszczególne odczyty były w jednej kolumnie (po przecinku), rozwiązanie @Riddle będzie dobre, ale w zależności od silnika musisz użyć różnych instrukcji (dla MS SQL będzie to STRING_AGG).

Jeśli chcesz, żeby poszczególne odczyty były w kolejnych kolumnach, musisz zainteresować się PIVOTem, ale zmartwię Cię na samym początku - w MS SQL (nie wiem, jak w innych silnikach) musisz na wstępie określić, ile tych kolumn (odczytów) będzie. Napisałeś, że więcej, niż 2. Jeśli znasz maksymalną ich liczbę, to pół problemu.

Ale zacznij od dokładnego określenia potrzeb i wskazania bazy, na której pracujesz.

Tak, masz rację. Teraz pracuje na MSSQL. Jednak te dane chce wysłać do bazy MySQL. Przed wygenerowaniem faktycznie wiem ile może być tych kolumn.
Następnie te dane chce przekazać na stronę wordpress do bazy MySQL. Więc jak łatwiej to zrobić w MySQL to teoretycznie pokazanie danych w jednej kolumnie mógłbym wykonać już na bazie MySQL.

Polecenie jakie działa ma MSSQL to:STRING_AGG, już przetestowałem ale to nie jest to rozwiązanie, którego szukam. Chciałbym aby kolejne "czasy" faktycznie były w innej kolumnie.

wemibo
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: okolice Warszawy
  • Postów: 128
0

Do sklejania, po przecinku etc. używam chętniej XML'a,

Kopiuj
SELECT 
    STUFF(
        (SELECT ',' + ColumnName
         FROM YourTable
         FOR XML PATH('')), 
        1, 1, '') AS ConcatenatedValues
FA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 223
1
Kopiuj
SELECT id
	, [1]
	, [2]
	, [3]
FROM (
	SELECT id
		, [odczyt 1]
		, czas
	FROM nazwa_tabeli
	) AS SourceTable
PIVOT(
	MIN(czas) 
	FOR [odczyt 1] IN ([1], [2], [3])
) AS PivotTable;
RL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0
Fac napisał(a):
Kopiuj
SELECT id
	, [1]
	, [2]
	, [3]
FROM (
	SELECT id
		, [odczyt 1]
		, czas
	FROM nazwa_tabeli
	) AS SourceTable
PIVOT(
	MIN(czas) 
	FOR [odczyt 1] IN ([1], [2], [3])
) AS PivotTable;

Wygląda, że to jest to czego szukam!
Teraz spróbuje to na moim zbiorze danych wkomponować.
Na przykładowej mojej tabeli gdzie to przetestowałem wygląda obiecująco do moich celów.
Dzięki.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.