2010-07-20 24 views
1

Ok, j'ai plus d'un million d'enregistrements et j'ai besoin de sélectionner toutes les informations de la base de données où le nombre de colonnes est supérieur ou égal à 10.À l'aide de SQL Server 2005, j'essaie de faire un HAVING dans une clause WHERE sonore fou?

Je ne peux pas utiliser les fonctions d'agrégation avec les opérateurs, ce que je veux dans le pseudo-code est

Select column1,column2,column3 
From MYdatabase 
Where count(column1) > 10 

C'est là où je suis coincé. Dois-je utiliser une sous-requête et ajouter une colonne appelée count? Je ne suis pas sûr de savoir comment je pourrais coder cela et étant que je suis un utilisateur SQL débutant, je pourrais regarder dans la mauvaise direction.

Toute ma requête est ci-dessous, je veux modifier si c'est le cas seulement les enregistrements avec un compte (callid)> = 10 seront sélectionnés.

Select 
    FiscalMonthYear, 
    'MyCenter' = Case EP.Center 
     When 'Livermore Call Center' Then 'LCC' 
     When 'Natomas Call Center' Then 'NCC' 
     When 'Concord Call Center' Then 'CCC' 
     When 'Virtual Call Center' Then 'VCC' 
     When 'Morgan Hill Call Center' Then 'MHCC' 
     Else Center 
     End, 
    ECH.segstart, 
    ECH.consulttime, 
    EP.Queue, 
    (EP.MgrFName +' '+ EP.MgrLName)AS Manager, 
    (EP.SupFName +' '+ EP.SupLName)AS Supervisor, 
    (EP.RepFName +' '+ EP.RepLName)As Agent, 
    EP.RepPERNR, 
    LEFT(ECH.segstart, 19) as SegmentDateTime, 
    ECH.origlogin, 
    ECH.dialed_num, 
    ECH.segment, 
    ECH.SegStart_Date, 
    ECH.callid 
FROM CMS_ECH.dbo.CaliforniaECH ECH 
    INNER JOIN CAPLESQL02.InfoQuest.dbo.IQ_Employee_Avaya_Id A ON ECH.origlogin = A.AvayaID 
    AND getdate() BETWEEN StartDate AND EndDate 
    INNER JOIN CAPLESQL02.InfoQuest.dbo.IQ_Employee_Profiles_v3 EP ON A.IQID = EP.RepID 
    AND getdate() BETWEEN RepToSup_StartDate and RepToSup_EndDate 
    AND getdate() BETWEEN SupToMgr_StartDate and SupToMgr_EndDate 
    AND getdate() BETWEEN RepQueue_StartDate and RepQueue_EndDate 
    INNER JOIN Cal_RemReporting.dbo.udFiscalMonthTable f on ECH.SegStart_Date = f.Tdate 
Where dialed_num not like '______' 
AND dialed_num not like '' 
AND dialed_num not like '_______' 
and EP.Center is NOT Null 
and EP.Center not like 'Comm Ops' 
and EP.Center not like 'Same Day Group' 
and MgrLName not like 'Hollman' 
and consulttime > 0 
and ECH.SegStart_Date between getdate()-90 and getdate()-1 
and EP.Queue not IN ('BST','Collections', 'DST','DSR','Escalations','Cable Store') 

je me suis résolu le problème en utilisant une requête de jonction interne qui sélectionne le 10 haut et se joint à l'ensemble des données sur la colonne de dialed_num. Fonctionne parfaitement, merci à tous pour votre aide!

Répondre

0

Vous pouvez le faire:

Select column1,column2,column3 
From MyTable 
Where (Select count(*) From MyTable Group By Column1) > 10 

Plus précisément à votre exemple, ajoutez:

+0

Nous vous remercions de votre aide! Ajouter cela en bas de la requête génère cette erreur: La sous-requête a renvoyé plus de 1 valeur. Ceci n'est pas autorisé lorsque la sous-requête suit =,! =, <, <= , >,> = ou lorsque la sous-requête est utilisée comme une expression. – CodingIsAwesome

+0

Mon erreur de modification maintenant. –

+0

Modifié - veuillez voir la correction. –

0

d'abord déterminer les données de ECH ont plus de 10 callid (pseudo-code):

select ECH.callid 
from CMS_ECH.dbo.CaliforniaECH ECH 
group by ECH.callid 
having count(*) > 10 

Ensuite, vous pouvez utiliser cela comme une sous-requête pour filtrer vos résultats:

... 
from ECH 
... 
where ECH.callid IN (
select ECH.callid 
from CMS_ECH.dbo.CaliforniaECH ECH 
group by ECH.callid 
having count(*) > 10 
) 
+0

Merci, mais votre requête renvoie 0 résultats où il devrait y en avoir environ 140 000. J'ai déjà rencontré ce problème: j'ai une clause HAVING: ayant count (callid)> = 10 mais ensuite mes résultats doivent être groupés.J'ai besoin de lignes individuelles et non de groupes. :(Que puis-je faire pour vous aider? – CodingIsAwesome

+0

Essayez de retirer une partie de la complexité de la requête, et lancez la première déclaration: sélectionnez ECH.callid, cOUNT (*) du groupe CMS_ECH.dbo.CaliforniaECH ECH par ECH.callid ayant count (*)> 10 Vérifiez que cela vous donne le résultat correct. une fois cela fait, il suffit de sélectionner une plaine à partir de ECH en utilisant la requête interne comme un filtre.Si cela fonctionne, le problème provient de certains sa partie de votre requête.Vous pouvez ajouter des jointures et des clauses where une à la fois jusqu'à ce que les résultats s'affichent, ce qui vous aidera à identifier la source du problème. – RMorrisey

0

Corrigé:

SELECT * FROM (SELECT 
    FiscalMonthYear, 
    'MyCenter' = CASE EP.Center 
     WHEN 'Livermore Call Center' THEN 'LCC' 
     WHEN 'Natomas Call Center' THEN 'NCC' 
     WHEN 'Concord Call Center' THEN 'CCC' 
     WHEN 'Virtual Call Center' THEN 'VCC' 
     WHEN 'Morgan Hill Call Center' THEN 'MHCC' 
     ELSE Center 
     END, 
    ECH1.segstart, 
    ECH1.consulttime, 
    EP.Queue, 
    (EP.MgrFName +' '+ EP.MgrLName)AS Manager, 
    (EP.SupFName +' '+ EP.SupLName)AS Supervisor, 
    (EP.RepFName +' '+ EP.RepLName)AS Agent, 
    EP.RepPERNR, 
    LEFT(ECH1.segstart, 19) AS SegmentDateTime, 
    ECH1.origlogin, 
    ECH1.dialed_num, 
    ECH1.segment, 
    ECH1.SegStart_Date, 
    ECH1.callid 
FROM CMS_ECH.dbo.CaliforniaECH ECH1 GROUP BY ECH1.dialed_num HAVING COUNT(ECH1.callid) >= 10) ECH 
    INNER JOIN CAPLESQL02.InfoQuest.dbo.IQ_Employee_Avaya_Id A ON ECH.origlogin = A.AvayaID 
     AND getdate() BETWEEN StartDate AND EndDate 
    INNER JOIN CAPLESQL02.InfoQuest.dbo.IQ_Employee_Profiles_v3 EP ON A.IQID = EP.RepID 
     AND getdate() BETWEEN RepToSup_StartDate AND RepToSup_EndDate 
     AND getdate() BETWEEN SupToMgr_StartDate AND SupToMgr_EndDate 
     AND getdate() BETWEEN RepQueue_StartDate AND RepQueue_EndDate 
    INNER JOIN Cal_RemReporting.dbo.udFiscalMonthTable f ON ECH.SegStart_Date = f.Tdate 
WHERE dialed_num NOT LIKE '______' 
    AND dialed_num NOT LIKE '' 
    AND dialed_num NOT LIKE '_______' 
    AND EP.Center IS NOT NULL 
    AND EP.Center NOT LIKE 'Comm Ops' 
    AND EP.Center NOT LIKE 'Same Day Group' 
    AND MgrLName NOT LIKE 'Hollman' 
    AND consulttime > 0 
    AND ECH.SegStart_Date BETWEEN getdate()-90 AND getdate()-1 
    AND EP.Queue NOT IN ('BST','Collections', 'DST','DSR','Escalations','Cable Store') 
+0

Merci, mais cela renvoie une erreur: Une expression de type non booléen spécifiée dans un contexte où une condition est attendue, près de ')'. – CodingIsAwesome

+0

oui ... désolé pour le ET ... c'est le tableau que vous avez à sélectionner de ... Je le mets juste et posterai bientôt adapté – laurent

+0

OK - regarde en ce moment - pas sûr de certaines choses mal orthographiées comme je impossible de lancer la requête pour vérifier mais j'ai vérifié sur une structure plus simple (avec moins de champs et sans jointures) et ça marche – laurent

0

je me suis résolu le problème en utilisant une requête de jonction interne qui sélectionne la partie supérieure 10 et se joint à l'ensemble des données sur la colonne de dialed_num. Fonctionne parfaitement, merci à tous pour votre aide!

+0

Je travaille avec mysql qui n'a pas de TOP (utilise LIMIT) mais si je me souviens bien, TOP sélectionne le TOP 10 résultats au maximum mais s'il y a moins de résultats que 10, il les renverra tous donc vous ne sélectionnerez pas seulement les appels avec 'callid> 10' donc je pense que TOP n'est pas utilisable mais je peux me tromper là-dessus. Quoi qu'il en soit, je pense que faire une jointure avec un TOP 10 dialed_num restreindra les données aux 10 numéros les plus composés et ne supprimera pas les données inférieures à 10 appels. – laurent