3
votes

Données dans la même ligne

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.

sql

1 commentaires

quels dbms? serveur sql, oracle, mysql ...?


3 Réponses :


1
votes
    ID  Mobile  PrefMobile  Email   PrefEmail
    1   1234567890  A   test@test.com   A
    2   1234567891  A   test1@test.com  B

2 commentaires

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+



3
votes

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 '%@%'


5 commentaires

@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.



2
votes

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


0 commentaires