MS SQL Server - SQL Query zum vereinigen von Datensätzen
Kleine Knobelaufgabe:
Ich möchte im M$ SQL Server eine View erzeugen, die mir aus zwei Ergebnisdatensätzen einen Datensatz erzeugt.
Die relevanten Tabellen lassen sich durch mehrere JOINs kombinieren, jedoch stehen zwei zu trennenden Informationen in zwei Ergebnissen einer Spalte.
Nun muss ich noch zwei Ergebnissätze:
zusammenfassen zu
oder, wer er weniger abstrakt mag, vin
zu:
Die Vereinigung der Ergebnisse benötige ich für die ODBC Anbindung einer Telefonanlage (flache Struktur vorrausgesetzt).
Ich möchte im M$ SQL Server eine View erzeugen, die mir aus zwei Ergebnisdatensätzen einen Datensatz erzeugt.
Die relevanten Tabellen lassen sich durch mehrere JOINs kombinieren, jedoch stehen zwei zu trennenden Informationen in zwei Ergebnissen einer Spalte.
Nun muss ich noch zwei Ergebnissätze:
a | b | 1 | c |
a | b | 2 | d |
zusammenfassen zu
a | b | c | d |
oder, wer er weniger abstrakt mag, vin
Name | Firma | Typ | Kontakt |
---|---|---|---|
Isabell | Microsoft | 1 | +49 711 47114711 |
Isabell | Microsoft | 2 | isabell@microsoft.com |
zu:
Name | Firma | Telefon | |
---|---|---|---|
Isabell | Microsoft | +49 711 47114711 | isabell@microsoft.com |
Die Vereinigung der Ergebnisse benötige ich für die ODBC Anbindung einer Telefonanlage (flache Struktur vorrausgesetzt).
Please also mark the comments that contributed to the solution of the article
Content-Key: 419769
Url: https://administrator.de/contentid/419769
Printed on: April 26, 2024 at 01:04 o'clock
7 Comments
Latest comment
Das ist erstmal Pipikram:
Aber:
Das setzt vorraus das immer beide Einträge gegeben sind. Ist dem nicht so musst du es anpassen.Gibt es einen Typ zu einem Namen und einer Firma mehrfach, musst du es anpassen. Kommen mehr Datenfelder dazu, solltest du es ggf. ganz anders aufbauen.
PS: Eine ID für die Kombination Name / Firma oder zumindest 2 IDs wären nützlich wenn wir das richtig aufbauen wollen. Die Kombination Name / Firma kann durch doppelte Schreibweise ja mehrfach vorhanden sein aber aus unterschiedlichen Objekten kommen.
SELECT t1.Name, t1.Firma,t1.Kontakt AS Telefon, t2.Kontakt AS Email
FROM tabelle t1 INNER JOIN tabelle t2 ON t1.Name = t2.Name AND t1.Firma = t2.Firma AND t2.Typ = 2 WHERE t1.Typ = 1
Das setzt vorraus das immer beide Einträge gegeben sind. Ist dem nicht so musst du es anpassen.Gibt es einen Typ zu einem Namen und einer Firma mehrfach, musst du es anpassen. Kommen mehr Datenfelder dazu, solltest du es ggf. ganz anders aufbauen.
PS: Eine ID für die Kombination Name / Firma oder zumindest 2 IDs wären nützlich wenn wir das richtig aufbauen wollen. Die Kombination Name / Firma kann durch doppelte Schreibweise ja mehrfach vorhanden sein aber aus unterschiedlichen Objekten kommen.
Warum sollte das auch nicht gehen?
Einfach mal probieren
Wenn ja, hast du deine Eindeutigkeit ja schon
Gruß
em-pie
Einfach mal probieren
Eine ID für Firma hätte ich.
Eine weitere ID für Name ist nur innerhalb der Firma unique.
D.h. es gibt irgendwo noch eine Zuordnung zu NameID und FirmaID und bilden zusammen einen gemeinsamen Primärschlüssel, oder steht die FirmaID mit in der obigen Tabelle (deinem Auszug)?Eine weitere ID für Name ist nur innerhalb der Firma unique.
Wenn ja, hast du deine Eindeutigkeit ja schon
Jetzt hast Du mich neugierig gemacht, wie wir das 'richtig aufbauen' könnten....
Mache einfach ein Left Join, statt Inner join und im Select abeitest du mit Case und IS Null:Select
a.Col1
, a.Col2
, Case
when b.Col3 IS NOT NULL Then b.Col3
Else ''
End as Col3
, b.Col4
From
Table1 as a
Left Join Table2 as b on a.Col1 = b.Col1 and a.Col2 = b.Col2
Gruß
em-pie
Würd ich so unterschreiben ;)
Kommt mir bekannt vor. hatt efürher mal für ERP System pogrammiert. Gab da aber 3 Tabellen. Nummer 2 war die Komm-Art und 3 standen dann die Daten (Telefon, Handy, E-Mail)
ID 0 gabs nict, war normal leer. Schön war immer wenn doch ein Nullsatz da war, und Nummer 0815 jeden zugeordnet wurde ... Autsch.
Kommt mir bekannt vor. hatt efürher mal für ERP System pogrammiert. Gab da aber 3 Tabellen. Nummer 2 war die Komm-Art und 3 standen dann die Daten (Telefon, Handy, E-Mail)
ID 0 gabs nict, war normal leer. Schön war immer wenn doch ein Nullsatz da war, und Nummer 0815 jeden zugeordnet wurde ... Autsch.
Sry hat etwas gedauert, wie wäre es mit:
WITH t AS (
SELECT ROW_NUMBER() OVER (PARTITION BY ID_Firma,ID_Person,Typ ORDER BY Kontakt) AS Zeile,
ID_Firma,
ID_Person,
Typ,
Kontakt
FROM tabelle
WHERE Typ IN ( 1,2 )
), stamm AS (
SELECT DISTINCT
ID_Firma,
ID_Person,
Firma,
Name
FROM tabelle
WHERE Typ IN ( 1,2 )
)
SELECT stamm.Firma,
stamm.Name,
t1.Kontakt AS Telefon1,
t2.Kontakt AS Telefon2,
t3.Kontakt AS Email
FROM stamm
LEFT JOIN t t1
ON stamm.ID_Firma = t1.ID_Firma
AND stamm.ID_Person = t1.ID_Person
AND t1.Typ = 1
AND t1.Zeile = 1
LEFT JOIN t t2
ON stamm.ID_Firma = t2.ID_Firma
AND stamm.ID_Person = t2.ID_Person
AND t2.Typ = 1
AND t2.Zeile = 2
LEFT JOIN t t3
ON stamm.ID_Firma = t3.ID_Firma
AND stamm.ID_Person = t3.ID_Person
AND t3.Typ = 2
AND t3.Zeile = 1