2016-11-16 3 views
0

J'essaie de trouver la meilleure façon de créer une requête.Conception de requête d'accès - Critères complexes?

Disons que j'ai deux tables

enter image description here

Dans la requête, je veux la valeur [Porte] pour être 'IRT'. Quand [Co State] = [Lic State], je veux que [Line] s'affiche, mais dans le cas où SC et TN ont deux entrées de ligne différentes, je n'ai besoin que de la valeur 'M' pour montrer.

Un résultat de l'échantillon serait comme ceci: enter image description here

Les données de ce tableau est juste un échantillon faux. Les données réelles incluent les 50 États et certains [État de la licence] auraient une valeur et quelques-uns en auraient deux. Y a-t-il un moyen facile de créer ces résultats avec une requête, ou serait-il mieux de créer une requête qui omet le [Etat de la Licence] de 'SC' et 'TN', et celui qui comprend seulement 'SC' et 'TN' qui ont une [Ligne] de 'M', puis prendre le SQL des deux requêtes et les joindre via UNION?

+0

Est-ce que SC et TN sont les seuls états avec des exigences spéciales lorsque deux valeurs existent? Il est toujours préférable de publier des données plutôt que des images. – Fionnuala

Répondre

0

Je suis sur le mobile, et je l'ai fait juste pour m'amuser, ouais ... ce n'est pas propre, l'idée est là.

Vous devez utiliser l'option Grouper par, car vous ne voulez qu'un enregistrement par état.

Sélectionnez d'abord (opérateur), puis (costate), iif (count (line)> 1, "M", first (line)) from (sélectionnez costate from t2 où licstate = "irt") left join t1 on Costate = licstate grouper par costate

0

Vous devez utiliser des fonctions agrégées. Et vous pouvez agréger sur IIF. Donc si vous groupez par CoState et comptez 1 pour chaque enregistrement avec un M, vous pouvez utiliser un IIF sur la valeur agrégée et redonner un M si vous avez besoin et sinon redonner la première valeur (parce que de votre question il n'y en aura qu'un valeur):

SELECT Tabelle2.Carrier, Tabelle2.CoState, IIf(Max(IIf([Tabelle1].[Line]="M",1,0))=1,"M",First([Tabelle1].[Line])) AS Line 
FROM Tabelle1 INNER JOIN Tabelle2 ON Tabelle1.LicState = Tabelle2.CoState 
GROUP BY Tabelle2.Carrier, Tabelle2.CoState 
HAVING (((Tabelle2.Carrier)="IRT")); 

Ainsi ses trois étapes: l'IIF intérieure redonne un 1 pour chaque jeu d'enregistrements avec un M. l'agrégation convertit ce à 1 pour les enregistrements qui devraient revenir avec un M et 0 pour les autres - et finalement l'IIF externe travaille sur la fonction agrégée et renvoie soit un M, soit la valeur de ligne. Puisque vous regroupez, vous devez également agréger sur cette valeur - ce que vous faites avec la directive FIRST.

+0

Les deux réponses (Johanness et user6788933) fonctionnent pour ce que je veux faire. Merci de votre aide! – CasWalker

+0

Pour les données données, ils font en effet la même chose. La solution user6788933s utilise une sous-requête (SELECT FROM (SELECT ...)) que je pense que vous devriez éviter si vous avez d'autres possibilités, car elle peut être très lente et consommatrice de mémoire. Si vous utilisez count (ligne) cela ne fonctionne que s'il y a toujours une deuxième colonne sur costates avec une colonne M. – Johanness