2012-05-14 3 views
2

J'essaie de créer une requête SQL qui renvoie un nom d'entreprise. Les employés sont membres des équipes ET des groupes, des équipes et des groupes sont membres des entreprises.Requête de critères croisés

Je dois sélectionner l'entreprise qui a des employés qui sont membres d'une équipe, qui a certains attributs dans leur ensemble.

Comment écrire SQL pour renvoyer les entreprises ayant un ratio membres/membres supérieurs de%? ex équipe A compte seulement 20 employés supérieurs sur 100 membres de l'équipe; il échoue donc et l'entreprise à laquelle appartient l'équipe A doit être retournée.

Je sais que je dois regrouper les employés en fonction de leur équipe, mais d'une manière ou d'une autre, il faut compter les employés qui ont SENIOR = YES contre SENIOR = NO ET retourner l'entreprise à laquelle ils appartiennent. Des idées?

Ils sont des tables MS Access qui contiennent des informations sensibles, mais vous pouvez penser aux tables comme étant mis en place comme suit:

tblBusiness: BID, bname
tblTeam: TID, TNAME, TBusRef
tblEmployee: EID, EName, ETeamRef, EBusRef, ESenior

J'ai littéralement essayé toutes sortes de SQL: j'ai tout fait, du nested SQL à l'agrégation lourde en passant par des expressions contenant count. Le plus proche (je pense) que j'ai obtenu est:

SELECT tblBuisiness.BName FROM tblBuisiness 
GROUP BY BName HAVING (
COUNT(SELECT DISTINCT tblEmployee.ETeamRef FROM tblEmployee WHERE ESenior=-1) 
/
COUNT(SELECT DISTINCT tblEmployee.ETeamRef FROM tblEmployee) 
< 0.5 
) 

Maintenant, celui-ci pourrait avoir des erreurs de syntaxe (était le presse-papiers), mais je suis allé à travers elle 100x et le plus proche je suis arrivé était « ne peut pas avoir une expression en agrégat "COUNT()/< 0.5" "

Si TeamA de Business1 a 20 membres principaux et 80 membres réguliers, cette requête doit renvoyer Business1.

+1

S'il vous plaît montrer les tableaux que vous travaillez et un examlpe de la sortie désirée. –

+0

Veuillez fournir au moins les structures de table (colonnes, lignes d'échantillons). De préférence, fournissez également au moins un exemple d'une requête échouée pour démontrer l'effort que vous faites. –

+0

Juste remarqué dans votre exemple que vous utilisez 'ESenior = -1'; Est-ce que ça veut dire "-1" plutôt que "1"? J'aurais pensé que si un employé est senior alors "ESenior" serait 1 sinon les non-seniors auraient "ESenior" égal à 0. –

Répondre

2

Peut-être:

SELECT * 
FROM (
    SELECT 
    e.EBusRef, 
    Count(e.EID) AS EmpCount, 
    Sum(Abs([ESenior])) AS Senior, 
    [Senior]/([EmpCount]/100) AS [%Senior] 
    FROM tblEmployee AS e 
    GROUP BY e.EBusRef) q 
WHERE q.[%Senior]<=50 
+0

+1 pour l'élégance –

+0

Apprenez quelque chose de nouveau tout le temps; Je n'avais aucune idée que vous pouviez donner le paramètre FROM comme une autre liste; pensé que c'était une table ou rien. – StuckAtWork

+0

Je pense que cela a résolu. Ça va prendre plus de bricolage pour s'adapter à mon application, mais la méthode est solide. Merci beaucoup! Vous recevrez un upvote chaque fois que je peux .. = S – StuckAtWork

0

Quelque chose comme ceci devrait vous donner les pourcentages. Vous avez juste besoin de l'envelopper de nouveau pour filtrer sur le terrain SeniorPercentage

select 
    B1.BName, 
    SeniorPercentage = ((select count(1) from tblEmployee E1 inner join tblTeam T1 where T1.TBusRef = B1.BID and E1.ESenior = 1)/(select count(1) from tblEmployee E2 inner join tblTeam T2 where T2.TBusRef = B1.BID)) 
From 
    tblBusiness B1 

PS Je n'ai pas écrit le joint complètement, mais vous pouvez l'ajouter facilement.

+0

Cela retourne tous les noms de famille au lieu de seulement les délinquants, et affiche un «0» pour le pourcentage ou un «N/A». L'accès me demande aussi la valeur "SeniorPercentage" .. il fait quelque chose mais pas ce que je veux. EDIT: Juste vu ce que cela fait: cela demande un pourcentage, et retourne -1 sur toute entreprise qui frappe EXACTEMENT ce pourcentage. Je vais essayer de l'emballer. – StuckAtWork

Questions connexes