MS SQL Server-Abfrage, die in andere Tabellenspalten aufgeteilt wird

315
Sarunas Radzevicius

Ich habe zwei Tische:

table1:

Manager | USER  --------+------ John | Tom  John | David John | Marry James | Henry 

table2: Jetzt ist leer, muss aber so sein:

Manager | User1 | User2 | User3 --------+-------+-------+------- John | Tom | David | Marry James | Henry | null | null  

Ist es möglich?

1
Es ist sicherlich möglich, aber Ihre Einschränkungen sind wichtig. Ich würde persönlich einen Sproc schreiben, der alle Mitarbeiter von table1 für einen bestimmten Supervisor zurückgibt. Ein Cursor über der Liste der verschiedenen Supervisoren würde dann alle Untergebenen abrufen und in die neue Tabelle einfügen. Es gibt wahrscheinlich Möglichkeiten, einfach den Code auszuwählen, aber Ihre (schlecht entworfenen) Tabellen werden das schwieriger machen. Ich würde empfehlen, dass Sie mit dem table1-Design bleiben und das table2-Design vermeiden, da es die zweite Normalform bricht. Frank Thomas vor 8 Jahren 0
Wenn Sie nur einen Bericht in diesem Format für eine temporäre Tabelle oder etwas generieren müssen, schauen Sie in der SELECT COALESCE-Syntax nach, da ich Berichte in SQL Server erstellt habe, wie Sie es nur für einen Bericht beschrieben haben Festes Tischdesign, aber das sollte Ihnen den Einstieg erleichtern. Schauen Sie sich auch dba.stackexchange.com an. Pimp Juice IT vor 8 Jahren 0
Ja, Sie müssen nur eine temporäre Tabelle abfragen und hinzufügen. Sie müssen das freigeben, was Sie versucht haben, damit wir basierend auf Ihrem vorhandenen Code helfen können :) Dave vor 8 Jahren 0

1 Antwort auf die Frage

0
shA.t

Wenn die table2Struktur wie gezeigt fixiert ist, können Sie Ihr erwartetes Ergebnis mit einer Abfrage wie folgt einfügen:

INSERT INTO table2 (Manager, User1, User2, User3)  SELECT Manager, MAX(CASE WHEN seq = 1 THEN [USER] END) AS User1, MAX(CASE WHEN seq = 2 THEN [USER] END) AS User2, MAX(CASE WHEN seq = 3 THEN [USER] END) AS User3 FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY Manager ORDER BY [USER]) AS seq FROM table1) t GROUP BY Manager; 

Wenn die table2Struktur jedoch nicht festgelegt ist, müssen Sie Dynamic SQL verwenden.