Pętla for each w zapytaniu SQL

Pętla for each w zapytaniu SQL
QG
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6
0

Cześć, mam taki problem mam tabelę z której selectem chcę wyciągnąć dane. Zgodnie z rysunkiem.
tabela.jpg

Czyli teoretycznie dla każdego Zlec_ID musiałbym zrobić for each. Da radę to w zapytaniu SQL osiągnąć?

woolfik
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1615
2

Da się :)

masterc
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 425
1

Tak da rade

UglyMan
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2206
4

Poszukaj o pivocie - teraz chyba większość baz to wspiera.

QG
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6
0

@woolfik: Super wiedzieć że się da :) a jakim sposobem? można prosić o poradę?

woolfik
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1615
4

Pewnie, że można jak podasz więcej szczegółów. Zapytałeś o poradę w dziale bazy danych ale nie podałeś co to za baza, a poszczególne bazy różnią się od siebie. Z grafiki, która załączyłeś wnioskuję, że to jakiś excel (ewentualnie Access) więc nie umiem odpowiedzieć po SQL'owemu :)

Robiąc zapytanie w tym dziale dobrze jest przygotować strukturę na :
sqlfiddle.com lub https://www.db-fiddle.com/

tam dajesz jakieś przykładowe zapytanie i na nim możemy Ci nawet przygotować gotowca. Natomiast nie podając struktury i tylko screena ciężko podać gotowca. Wcześniej @UglyMan podał Ci nazwę funkcji PIVOT, choć nie znając dystrybucji bazy danych ciężko powiedzieć czy to wystarczy.

Marcin.Miga
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2794
5

Chyba PIVOT będzie ciężko, bo tu w zależności od atrybutu bierze się pod uwagę różne kolumny...
To będzie coś w ten deseń:

Kopiuj
SELECT Zlec_id, Min(CASE WHEN Atribute_Id=303 THEN value_text END) "303", Min(CASE WHEN Atribute_Id=307 THEN value_date_time END) "307", Min(CASE WHEN Atribute_Id=309 THEN value_text END) "309", Min(CASE WHEN Atribute_Id=310 THEN value_float END) "310"
FROM
tabela
WHERE
Atribute_ID IN (303,307,309,310) /* dla pewności */
GROUP BY Zlec_id
Damian Korczowski
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 113
0

To co opisałeś to np. w SQL Server rozwiązuje się Kursorem (for each) -> https://docs.microsoft.com/en-us/sql/t-sql/language-elements/declare-cursor-transact-sql?view=sql-server-ver15

Jednak musisz mieć świadomość że jest to bardzo wolne ;-)

Albo PIVOT tak jak koledzy wyżej napisali.

QG
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6
0

Dzięki @Marcin.Miga za rozwiązanie. Trochę muszę pozamieniać, żeby było zgodne z moimi tabelami i zamierzeniami, ale o to chodziło.
Do tych obrażających mnie.. :) sory za zamieszanie. Musiałem pozamieniać nazwy pól i tabeli, faktycznie może warto było zrobić to profesjonalniej.
Wybaczcie.
@UglyMan PIVOT u mnie niestety nie wystarczył, ale dzięki za podpowiedź. Dzięki Tobie dowiedziałem się o takiej możliwości. Ważne uczyć się nowych rzeczy.
Temat można zamknąć.

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.