Pouvez-vous aider à marquer les valeurs dupliquées dans une colonne supplémentaire sans regrouper des valeurs dupliquées? P>
Voir mes exemples de données (exemple de ce que j'ai et ce dont j'ai besoin pour atteindre à droite): P>
Comme vous pouvez le voir, j'ai un identifiant de produit avec suffixe e strong> (puissance) et ID de produit uniquement avec La chose délicate consiste à ajouter une colonne sur le site droit avec des informations que l'identifiant est double produit et lequel est uniquement de l'alimentation ou du gaz uniquement. P>
Pouvez-vous m'aider à obtenir une telle colonne sans regrouper les ID du produit?
Merci d'avance! Pawel P>
3 Réponses :
Vous ne mentionnez pas quelle base de données vous utilisez, donc je suppose que c'est MySQL 8.x.
Il est probablement préférable de séparer le Notez que j'utilise ID code> à partir du type
à partir du type code> à l'aide d'un CTE. Ensuite, la requête devient beaucoup plus facile. Par exemple: p>
Union tout code>. En effet, MySQL n'applique pas (encore) les jointures extérieures complètes. L'astuce ici consiste à répéter la requête quelque peu inversée em>. P> p>
SELECT t1.*, CASE WHEN t2.CustomerAccount IS NOT NULL THEN 'Dual Product' WHEN t1.Product = 'Gas' THEN 'Gas Only' WHEN t1.Product = 'Power' THEN 'Power Only' ELSE 'Wrong product type' END ProductType FROM sourcetable t1 LEFT JOIN sourcetable t2 ON t1.CustomerAccount = t2.CustomerAccount AND t1.Product != t2.Product The query do NOT use ProductID and do NOT check that it matches CustomerAccount and/or Product. It will be excess work without any profit.
Merci, j'ai également pensé à rejoindre la table. Votre solution m'a donné des doublons, je pense parce que la jointure est faite sur CustomerAccount. Y a-t-il un moyen de le modifier afin que la table soit jointe à l'aide d'ID de produit? Merci
@Pawel_l à gauche (T1.Production, longueur (T1.Product) - 1) = gauche (T2.Production, longueur (T2.Product) - 1) code>, par exemple.
Si vous exécutez MySQL 8.0, vous pouvez le faire avec des fonctions de fenêtre uniquement, sans jointures, sous-requêtes ou CTES.
Je suggérerais de comparer simplement les valeurs maximales et minimales du produit code> pour chaque client; Quand ils diffèrent, vous avez un "Produit double". P>
select
t.*,
case when min(product) over(partition by customer_account) <> max(product) over(partition by customer_account)
then 'Dual Product'
else concat(product, ' Only')
end single_or_dual_product
from mytable t