2017-11-20 2 views
0

Hallo allerseits, mein Name ist Penelope und ich habe etwa 4 Jahre Erfahrung mit SQL. Zuerst möchte ich Ihnen danken, dass Sie sich die Zeit genommen haben, dies zu lesen und dann eine Anleitung, ein Beispiel, einen Spaziergang oder eine Anleitung zu geben. Ich habe ein SQL-Problem/Puzzle, das ich einfach nicht herausfinden kann. Ich habe erfolglos versucht, mehrere Datensätze in Rekord zu verketten. Ich habe einige Erfahrung mit Joins, aber diese scheint mir ein wenig über den Kopf zu gehen und ich hoffte auf etwas Hilfe oder Anleitung. Ich möchte nur einen langen Schülerbericht, aber wie Sie sehen werden, bekomme ich die richtigen Daten, aber mehrere Datensätze werden erstellt, weil einige Tabellen mehr als einen Datensatz haben. Unten können Sie die Namen der Tabellen und Spalten sehen, die ich als einen Datensatz in eine Tabelle namens EntireStudentI einfügen muss. My SQL, und meine aktuellen Ergebnisse Ich habe Tabelle TP genannt, die gibt mir grundlegende Informationen über den Schüler in einem DatensatzWie kombiniert man mehrere Zeilen aus 4 Tabellen in einer neuen Tabelle in SQL zu einer einzelnen Zeile?

trans_type 
trk_link 
service_db  
scn 
given_nm 
surname_nm 
cc 
sex 
grade 
dob 
marital_st 
pob_city 
pob_cntry 
UScitizenship_CD 

Ich habe eine Tabelle P genannt, die mir einen Datensatz geben, wo ich die Passnummer wollen

pass_nbr 

ich habe eine Tabelle namens VI, die mich mehrere Datensätze als die Schüler mehrere Visa

pass_nbr haben geben könnte - gleichen Namen wie im Pass aber in diesem Fall ist es Visa Anzahl so in meiner SQL I gesetzt es als VisaNo um weniger verwirrend sein. Dies kann keine Aufzeichnungen sein, eins, zwei ...

Schließlich habe ich eine Tabelle namens PD, die abhängig sind/Familienmitglieder des Schülers. Dies kann keine Datensätze sein, eins, zwei ...

given_nm und surname_nm (diese verketteten wird DepName zu machen)

dep_rel 
birth-dt 

Was ich ist ein Datensatz tun wollen haben, die die Spalten oben aufgeführten für TP .

Fügen Sie dann die Spalte pass_nbr als Spalte aus der P-Tabelle hinzu.

Fügen Sie dann die VisaNo (s) aus der VI-Tabelle als durch Komma getrennte Spalte hinzu. - Die VisaNo könnte leer sein, oder eine VisaNo oder mehrere VisaNo. Beispiel wäre ein leerer Spaltenwert, eine Zahl, dh. 89888 oder mehrere Werte 89888,78908,78999.

Schließlich möchte ich abhängige Info-Spalten aus der PD-Tabelle hinzufügen. Ein Schüler braucht keine abhängigen Personen zu haben oder er könnte mehrere abhängige Personen haben, wie zum Beispiel einen Ehepartner und ein Kind. - Ein Ehepartner und ein Kind würden zwei Datensätze erstellen, zwei separate Datensätze in der PD-Tabelle. In meinem einzigen Datensatz würde ich hoffe, Spalte Depname, Spalte begrenzt dep_rel begrenzt zu haben, und durch Komma getrennt birth_dt

Alle diese Tabellen werden durch eine Spalte namens trk_link zusammen gebunden, die der Schlüssel

ist Das ist mein SQL

SELECT t.trans_type 
     ,t.trk_link 
     ,t.service_db  
     ,t.scn 
     ,t.given_nm 
     ,t.surname_nm 
     ,t.cc 
     ,t.sex 
     ,t.grade 
     ,t.dob 
     ,t.marital_st 
     ,t.pob_city 
     ,t.pob_cntry 
     ,CASE t.UScitizenship_CD 
      WHEN 'H' THEN 'Holds' 
      WHEN 'DNH' THEN 'Does Not Hold' 
      else '' 
      End as Student_Citizenship_Status 

     --,t.UScitizenship_CD 
     ,t.trk_link20 
     ,p.pass_nbr 
     ,v.pass_nbr as VisaNo, 
     CONCAT(p2.given_nm, ' ', p2.surname_nm) As DepName 
     --,p2.given_nm 
     --,p2.surname_nm 
     ,p2.dep_rel 
     ,p2.birth_dt 
     ,CASE p2.UScitizenship_CD 
      WHEN 'H' THEN 'Holds' 
      else 'Does Not Hold' 
      End as Dependent_Citizenship_Status 

from TP t 
inner join P p 
on t.[trk_link] = p.[trk_link] 

inner Join VI v 

on p.[trk_link] = v.[trk_link] 

inner join PD p2 
on t.[trk_link] = p2.[trk_link] 

where t.trk_link = '22985200458053000003171117104111' 

Und das ist das Ergebnis

enter image description here

Vielen Dank Jungs Penelope! `

Antwort

1

Es gibt viele Möglichkeiten, dies zu erreichen. Sie können STUFF und XML PATH verwenden oder Sie können eine benutzerdefinierte Funktion verwenden.

Die einfachste Methode wäre benutzerdefinierte Funktion hinzufügen und verwenden Sie es wo immer Sie wollen.Sie müssen nicht einmal die Funktion erstellen.Es ist bereits verfügbar unter GROUP_CONCAT string aggregate for SQL Server.

Sie können es wie folgt:

SELECT some_id, 
     dbo.GROUP_CONCAT(some_column) AS as delimited_list 
FROM dbo.some_table 
GROUP BY some_id; 

Es gibt eine Ausgabe wie:

some_id   delimited_list 
----------------- ----------------------------------- 
1     red,green,blue 
2     cyan,magenta,yellow,key 

ODER

Sie versuchen STUFF und XML PATH verwenden kann, wie ich schon sagte.

SELECT t.trans_type 
     ,t.trk_link 
     ,t.service_db  
     ,t.scn 
     ,t.given_nm 
     ,t.surname_nm 
     ,t.cc 
     ,t.sex 
     ,t.grade 
     ,t.dob 
     ,t.marital_st 
     ,t.pob_city 
     ,t.pob_cntry 
     ,CASE t.UScitizenship_CD 
      WHEN 'H' THEN 'Holds' 
      WHEN 'DNH' THEN 'Does Not Hold' 
      else '' 
      End as Student_Citizenship_Status 

     --,t.UScitizenship_CD 
     ,t.trk_link20 
     ,p.pass_nbr 
     --,v.pass_nbr as VisaNo, 
     ,STUFF((SELECT VisaNo 
       from VI as v 
       where v.[trk_link]=p.[trk_link] 
       FOR XML PATH('')),1,1,'') as VisaNumbers 
     ,CONCAT(p2.given_nm, ' ', p2.surname_nm) As DepName 
     --,p2.given_nm 
     --,p2.surname_nm 
     ,p2.dep_rel 
     ,p2.birth_dt 
     ,CASE p2.UScitizenship_CD 
      WHEN 'H' THEN 'Holds' 
      else 'Does Not Hold' 
      End as Dependent_Citizenship_Status 

from TP t 
inner join P p 
on t.[trk_link] = p.[trk_link] 
--inner Join VI v 
--on p.[trk_link] = v.[trk_link] 
inner join PD p2 on t.[trk_link] = p2.[trk_link] 
where t.trk_link = '22985200458053000003171117104111' 

Hinweis: In der Beschreibung wurde angegeben, dass VisNumber als VisaNo in v table.But in Ihrer Abfrage wählen Sie versuchen, pass_nbr gespeichert wird. Also, ich bin mir nicht sicher, wie es in Ihrer Datenbank gespeichert ist. Machen Sie die Änderungen entsprechend.

+0

Vielen Dank Jibin !!. Das zweite Beispiel mit ein wenig Feingefühl gab mir genau das, was ich brauchte. Penelope –

+0

@PenelopeEstes Ich bin froh, dass es für Sie geklappt hat. Sie können dies als richtige Antwort markieren, so dass es für die anderen Personen nützlich ist, die diese Frage stellen. –

Verwandte Themen