J'ai une table.
ID Mobile Pref Email Pref 1 1234567890 A test@test.com A 2 1234567891 A test@test.com B
une simple requête de sélection ne résoudra pas ce problème
select contact_details as mobile,contact_details as email from table where pref in (A,B);
Je veux un résultat comme celui-ci:
ID Contact_Details Pref 1 1234567890 A 1 test@test.com A 2 1234567891 A 2 test1@test.com B
Veuillez noter que j'ai des préférences différentes pour les e-mails et les mobiles et je veux que cela apparaisse dans la sortie.
3 Réponses :
ID Mobile PrefMobile Email PrefEmail
1 1234567890 A test@test.com A
2 1234567891 A test1@test.com B
Réponse spécifique au produit à une question sans dbms spécifié. Au moins, dites-nous à quels dbms il s'agit.
Ma réponse est une solution pour le serveur MS Sql 2012+
Vous pouvez écrire:
select t1.ID, t1.Contact_Details as Mobile, t1.Pref as PrefMobile,
t2.Contact_Details as Email, t2.Pref as PrefEmail
from Table t1
inner join Table t2
on t1.ID = t2.ID
where t1.Contact_Details not like '%@%'
and t2.Contact_Details like '%@%'
@Moudiz pourquoi pas?
Cela fonctionnera avec les exemples de données donnés, mais ne retournera pas les lignes où le mobile ou l'e-mail est manquant. Vous auriez besoin d'une jointure complète pour cela, qui à son tour nécessite de déplacer la condition LIKE sur l'alias t2 vers la condition JOIN .
Je n'ai pas remarqué que les identifiants ne sont pas uniques. de cette manière, cela fonctionnera.
@a_horse_with_no_name Je crois que les deux champs sont obligatoires.
@Rajesh Heureux de pouvoir vous aider.
Quelque chose comme celui-ci fonctionnera:
SELECT Id,
MAX(CASE WHEN Contact_Details NOT LIKE '%@%' THEN Contact_Details END) as Mobile,
MAX(CASE WHEN Contact_Details NOT LIKE '%@%' THEN Pref END) as MobilePref,
MAX(CASE WHEN Contact_Details LIKE '%@%' THEN Contact_Details END) as EMAil,
MAX(CASE WHEN Contact_Details LIKE '%@%' THEN Pref END) as EMailPref
FROM T
GROUP BY ID
quels dbms? serveur sql, oracle, mysql ...?