Sql Server – ordre par numéro

J'ai 3 tables. La première est la table des counts, puis la table des contacts et la table des téléphones.

Exigence de la requête im essayant d'écrire ici est que pour un count donné, montrez le contact principal en haut avec tous ses numéros de téléphone, puis montrez le rest des contacts sortingés par nom. Les téléphones doivent également apparaître dans une séquence prédéfinie. Numéro de téléphone à la maison d'abord, puis numéro de téléphone de travail etc.

C'est ce que j'ai jusqu'ici

SELECT c.ContactID, c.FullName, p.PhoneCategory, p.Phone, a1.MainContactID FROM Contact c JOIN Phone p ON p.ContactID = c.ContactID JOIN Account a1 ON a1.AccountID= c.AccountID WHERE a1.AccountID= 1000 ORDER BY c.FullName, CASE PhoneCategory WHEN 'Home Phone' THEN 1 WHEN 'Business Phone' THEN 2 WHEN 'Cell Phone' THEN 3 WHEN 'Fax' THEN 4 WHEN 'Other Phone' THEN 5 WHEN 'Email Address' THEN 6 WHEN 'E-Mail' THEN 6 END 

En exécutant ceci, j'obtiens la list sortingée par nom, et les nombres apparaissent également dans le bon ordre. Le seul problème est que je ne peux pas déterminer comment get le maincontact à apparaître en haut

Edit: Avait tapé c1.MainContactID au lieu de a1

Je pense que cela aiderait si vous monsortingez un peu plus du schéma de la database. C'est à dire: comment pouvez-vous déterminer qu'un contact est un contact principal?

J'ai deux idées:

  1. Vous pouvez utiliser deux requêtes distinctes et utiliser une command UNION pour créer un jeu de résultats.
  2. D'après ce que je vois ici, je suppose que pour un contact principal, son identifiant correspond au MainContactID d'un count? Dans ce cas, je pense que vous pouvez le faire avec une requête en utilisant une jointure externe gauche sur la colonne MainContactID , puis en effectuant un sorting. Cette colonne sera NULL pour les autres contacts, non?

Ce n'est pas clair ce que c1 est – mais si c'est une jointure non montrée qui vous donne un identifiant pour le contact principal et null pour le contact non principal, alors votre requête devrait ressembler à ceci:

 SELECT c.ContactID, c.FullName, p.PhoneCategory, p.Phone, c1.MainContactID FROM Contact c JOIN Phone p ON p.ContactID = c.ContactID JOIN Account a1 ON a1.AccountID= c.AccountID WHERE a1.AccountID= 1000 ORDER BY CASE WHEN a1.MainContactID = c.ContactID THEN 1 ELSE 0 END, c.FullName, CASE PhoneCategory WHEN 'Home Phone' THEN 1 WHEN 'Business Phone' THEN 2 WHEN 'Cell Phone' THEN 3 WHEN 'Fax' THEN 4 WHEN 'Other Phone' THEN 5 WHEN 'Email Address' THEN 6 WHEN 'E-Mail' THEN 6 END