2010-07-20 4 views
1

Хорошо, у меня более миллиона записей, и мне нужно выбрать всю информацию из базы данных, где количество столбцов больше или равно 10.Использование SQL Server 2005 Я пытаюсь сделать HAVING в предложении WHERE безумным?

Я знаю, что с использованием того, что я должен использовать группу и используя Я не могу использовать агрегированные функции с операторами, поэтому я хочу, чтобы в псевдокоде было

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

Здесь я застрял. Использую ли я подзапрос и добавляю столбец с именем count? Я не уверен, как я буду кодировать это из рук и быть тем, что я начинающий пользователь SQL, я мог бы смотреть в совершенно неправильном направлении.

Весь мой запрос ниже, я хочу изменить, если это так, будут выбраны только записи с подсчетом (callid)> = 10.

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') 

я решил проблему сам, используя внутренний запрос присоединения, который выбирает топ-10 и соединяет все данные на колонке dialed_num. Работает безупречно, спасибо вам всем за вашу помощь!

ответ

0

Вы можете сделать это:

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

Более конкретно к вашему примеру, добавить:

+0

Благодарим за помощь! Добавление этого в нижней части запроса дает эту ошибку: Subquery возвращает более 1 значения. Это недопустимо, когда подзапрос следует =,! =, <, <= , >,> = или когда подзапрос используется как выражение. – CodingIsAwesome

+0

Моя ошибка в настоящее время изменяется. –

+0

Внесены изменения - см. Исправление. –

0

Сначала определите, какие данные ECH имеют более чем 10 CallID (псевдо-код):

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

Вы можете использовать это в качестве подзапроса, чтобы фильтровать свои результаты:

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

Спасибо, но ваш запрос возвращает 0 результатов, где должно быть около 140 000. Я столкнулся с этой проблемой раньше. Я использовал предложение HAVING: Имея счетчик (callid)> = 10, но тогда мои результаты должны быть сгруппированы. Мне нужны отдельные строки, а не группы. :(Что я могу сделать, чтобы помочь вам помочь? – CodingIsAwesome

+0

Попробуйте отбросить часть сложности запроса и сначала запустите верхний оператор: select ECH.callid, граф (*) из CMS_ECH.dbo.CaliforniaECH ECH группы по ECH.callid , имеющий счет (*)> 10 Убедитесь, что это дает правильный результат. Как только это сделано, не только простой выбор из ECH с использованием внутреннего запроса в качестве фильтра. Если это работает, то проблема возникает из-за некоторого ее часть вашего запроса.Вы можете добавлять соединения и предложения по одному за раз, пока результаты не выпадут, и это поможет вам определить источник проблемы. – RMorrisey

0

Исправлено:

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

Спасибо, но это возвращает ошибку: выражение небулевого типа, указанное в контексте, где ожидается условие, около ')'. – CodingIsAwesome

+0

да ... извините за AND ... это таблица, которую вы должны выбрать из ... Я исправляю ее и скоро опубликую. – laurent

+0

OK - выглядит прямо сейчас - не уверен в некоторых неправильных вещах, поскольку я не может выполнить запрос для проверки, но я проверил на более простой структуре (с меньшим количеством полей и без соединений), и он работает – laurent

0

я решил проблему сам, используя внутренний запрос присоединения, который выбирает топ-10 и соединяет все данные на колонке dialed_num. Работает безупречно, спасибо вам всем за вашу помощь!

+0

Я работаю с mysql, у которого нет TOP (использует LIMIT), но если я хорошо помню, TOP выбирает TOP 10 результат будет максимальным, но если будет меньше результатов, чем 10, он вернет все из них, поэтому вы не будете выбирать только вызовы с 'callid> 10', поэтому я думаю, что TOP недоступен, но я могу ошибаться. В любом случае, я думаю, что соединение с TOP 10 dialed_num будет ограничивать данные 10 самыми набранными номерами и не удалять данные ниже 10 вызовов. – laurent