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 :
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
3 Réponses :
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.
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.
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;
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
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
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.