1
votes

Combinez les valeurs de plusieurs lignes en une seule ligne avec chaque valeur dans sa propre colonne

J'ai un certain nombre de sites sur lesquels les clients peuvent s'inscrire et je souhaite combiner en une seule ligne tous les identifiants clients associés à une adresse e-mail sur tous les sites. Je travaille dans SQL Server.

Exemple de données source:

Ce que je voudrais réaliser dans un nouveau tableau :

 enter image description here

Ma première pensée a été quelque chose comme ça, avec l'email comme clé primaire mais ça ne marche pas. Puis-je utiliser une expression CASE?

SELECT c.[Email],
       (SELECT c.[CustomerID] FROM Customer c WHERE c.[BrandID] = '1859') AS [Brand1],
       (SELECT c.[CustomerID] FROM Customer c WHERE c.[BrandID] = '1594') AS [Brand2],
       (SELECT c.[CustomerID] FROM Customer c WHERE c.[BrandID] = '4578') AS [Brand3]
  FROM Customer c


1 commentaires

veuillez partager des textes au lieu d'images pour afficher des données. quelqu'un comme moi ne peut pas voir les images en raison de l'existence de certains filtrages et les textes sont facilement copiés pour être utilisés dans les violons.


3 Réponses :


3
votes

Utilisez simplement l'agrégation conditionnelle:

SELECT c.Email,
       MAX(CASE WHEN BrandID = 1859 THEN c.[CustomerID] END) as Brand1,
       MAX(CASE WHEN BrandID = 1594 THEN c.[CustomerID] END) as Brand2,
       MAX(CASE WHEN BrandID = 4578 THEN c.[CustomerID] END) as Brand3
FROM Customer c
GROUP BY c.Email;

BrandID ressemble à un nombre, j'ai donc supprimé les guillemets simples autour de la valeur de comparaison. Bien sûr, utilisez des guillemets simples s'il s'agit vraiment d'une chaîne.


3 commentaires

OP n'a pas besoin de somme mais de customerId.


@Gordon vous devez ajouter la colonne BrandID et customerID dans le groupe si vous supprimez SUM, votre requête ne renvoie pas la sortie attendue


@RedDevil, j'avais édité cette réponse et oublié d'inclure la fonction MAX.



0
votes

Vous pouvez essayer un cas comme celui-ci:

SELECT c.Email,
   SUM(CASE WHEN BrandID = 1859 THEN CustomerID ELSE 0 END) as Brand1,
   SUM(CASE WHEN BrandID = 1594 THEN CustomerID ELSE 0 END) as Brand2,
   SUM(CASE WHEN BrandID = 4578 THEN CustomerID ELSE 0 END) as Brand3
FROM Customer c
GROUP BY c.Email;


6 commentaires

Est-il nécessaire d'utiliser la somme?


Oui, pour avoir toute la sortie dans une seule ligne, nous devons utiliser SUM


Ne pensez-vous pas que le cas seul gérera cela.


Non, si nous n'utilisons que l'instruction case, elle retournera 3 lignes séparées, nous devons utiliser une fonction d'agrégation pour obtenir la sortie souhaitée


D'accord, et nous pouvons remplacer le SUM par MAX.


Oui, nous pouvons également remplacer par max



0
votes

Vous pouvez utiliser pivot pour la même chose.

 ; with cte as (
 select row_number() over (partition by email order by brandid) as Slno,
 Email, brandid from table)
  , ct as (
  select brandid, 'brand' + cast(slno as varchar(5)) as Col, email from cte )
  select * from (
  select brandid, col, email from ct ) as d
  pivot (
  max(brandid) for col in ( [brand1], [brand2], [brand3] )
  ) as p


0 commentaires