Łączenie tabel - powielone wiersze

Łączenie tabel - powielone wiersze
DI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
0

Witam

Zrobiłem zapytanie:

Kopiuj
select a.name, a.name1, a.address1, a.zipcode, a.city, b.data, d.discount, a.dues_limit, a.term_of_payment, c.PGRO_name, a.person_type_name
FROM [RC].dbo.vPerson a
RIGHT JOIN [RC].dbo.contact_to_person b
ON a.id = b.Person_Id
JOIN [RC].dbo.VPerson_group_to_Person c
ON a.id = c.Person_Id
LEFT JOIN [RC].dbo.vDiscount d
ON a.id = d.Person_Id

Ale wynik nie jest satysfakcjonujący. Chodzi o to, że jak dana firma ma trzy kontakty to w wynikach jest trzy razy z różnym kontaktem, pokażę to na przykładzie ponieżej:
mamy takie dwie tabele
screenshot-20220823085129.png

Wynik zapytanie otrzymuję taki:
screenshot-20220823085232.png

A chciałbym aby wyglądało tak:
screenshot-20220823085344.png

Podpowie ktoś jak powinno wyglądać zapytanie? Wydaje mi się, że muszą być podzapytanie ale nie mogę trafić na coś podobnego z podzapytaniami.

S4
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1268
0

A to który ten kontakt ma być? Pierwszy z brzegu? Czy są jakieś inne kryteria doboru?

ZD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2310
0

@dippaolo:

Ja czasem używam group by firma a pole kontakt wyłuskuję np jakieś max(kontakt) - ale tu bardzo ważne jest pytanie

S4t napisał(a):

A to który ten kontakt ma być? Pierwszy z brzegu? Czy są jakieś inne kryteria doboru?

Dokładnie

generalnie u siebie, jak jestem w podobnej sytuacji, traktuję jako skutek lekkiego zaplątania się - rozwiązania akceptuję jako "może być" a nie "idealne"

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

Najszybciej zrobisz to tak:

Kopiuj
select a.name, a.name1, a.address1, a.zipcode, a.city, b.data, d.discount, a.dues_limit, a.term_of_payment, c.PGRO_name, a.person_type_name
FROM [RC].dbo.vPerson a
RIGHT JOIN (SELECT *, row_number() over(...) lp FROM [RC].dbo.contact_to_person) b
ON a.id = b.Person_Id and b.lp=1
JOIN [RC].dbo.VPerson_group_to_Person c
ON a.id = c.Person_Id
LEFT JOIN [RC].dbo.vDiscount d
ON a.id = d.Person_Id
AR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 39
0

Jeśli masz jakiś patent na odróżnienie numeru telefonu od faksu to nie będzie problemu. Testowałem na postgresie.

Kopiuj
with dane as (
select 1 firma, '123456789' kontakt
union all
select 1 firma, 'adres@firma.pl' kontakt
union all
select 1 firma, 'fax: 123456789' kontakt
), telefony as (
select firma, kontakt from dane where kontakt ~ '^[0-9]{9}$' 
), maile as (
select firma, kontakt from dane where kontakt ~ '[^@ \t\r\n]+@[^@ \t\r\n]+\.[^@ \t\r\n]+'
), faksy as (
select firma, kontakt from dane where kontakt like 'fax%' 
), idfirm as (
select distinct firma from dane
)

select idf.firma, t.kontakt telefon, m.kontakt mail, f.kontakt faks
from idfirm idf
left join faksy f on (f.firma = idf.firma)
left join maile m on (m.firma = idf.firma)
left join telefony t on (t.firma = idf.firma)

Zamiast mojego zapytania do tabeli dane dajesz swoje i powinno działać. Oczywiście wyrażenia regularne i like mogą być inne - chodzi tylko o pokazanie zasady działania.

DI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
0
S4t napisał(a):

A to który ten kontakt ma być? Pierwszy z brzegu? Czy są jakieś inne kryteria doboru?

Przepraszam za brak odpowiedzi. Przydzielono mi pilne zadanie i to musiałem odłożyć.

Wiec tak. Tabela z kontaktem wygląda tak:
screenshot-20220826115021.png

Interesują mnie kontaty z ID 1, 2 i 4 (tel stacjonarny, komórkowy, mail)

W moim zapytaniu mam trzy wiersze bo w każdym jest inny kontakt. Chciałbym aby wiersz dla jednej osoby był jeden a kontakty w kolejnych kolumnach.

S4
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1268
1

Czyli chcesz zrobić Pivot. Poszukaj w dokumentacji jak takie coś zrobić, w której bazie używasz. Chyba większość topowych to wspiera.

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.