1 votes

Requête MS SQL Server qui divise en d'autres colonnes de table

J'ai deux tables :

table1:

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

table2 : Maintenant est vide, mais doit être comme ceci :

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

Est-ce possible ?

0 votes

C'est certainement possible, mais vos contraintes importent. personnellement, j'écrirais une procédure stockée qui renvoie tous les employés de la table1 pour un superviseur donné. Ensuite, un curseur sur la liste distincte des superviseurs vous permettrait d'obtenir tous les subordonnés et de les insérer dans la nouvelle table. Il existe probablement des façons de le faire avec juste du code de sélection, mais vos tables (mal conçues) rendront cela plus difficile. Je vous recommanderais de rester fidèle à la conception de table1 et d'éviter la conception de table2, car elle rompt avec la deuxième forme normale.

0 votes

Si vous avez simplement besoin de générer un rapport dans ce format vers une table temporaire ou quelque chose du genre, regardez la syntaxe SELECT COALESCE car j'ai généré des rapports dans SQL Server comme vous le décrivez juste pour un rapport mais je ne le ferais pas pour une conception de table permanente mais cela devrait vous permettre de commencer. Consultez aussi dba.stackexchange.com.

0 votes

Oui, il vous suffit de faire une requête et d'ajouter à une table temporaire.. Vous devrez partager ce que vous avez essayé afin que nous puissions vous aider en fonction de votre code existant :)

0voto

shA.t Points 468

Si la structure de table2 est fixe comme vous l'avez montré, vous pouvez insérer votre résultat attendu dedans avec une requête comme celle-ci :

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;

Mais, si la structure de table2 n'est pas fixe, vous devez utiliser un SQL dynamique.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X