Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQLServer2005,我正在尝试在WHERE子句中使用HAVING,这听起来很疯狂吗?_Sql_Sql Server 2005_Subquery_Where Clause_Having - Fatal编程技术网

使用SQLServer2005,我正在尝试在WHERE子句中使用HAVING,这听起来很疯狂吗?

使用SQLServer2005,我正在尝试在WHERE子句中使用HAVING,这听起来很疯狂吗?,sql,sql-server-2005,subquery,where-clause,having,Sql,Sql Server 2005,Subquery,Where Clause,Having,好的,我有超过一百万条记录,我需要从数据库中选择所有信息,其中一列的计数大于或等于10 我知道使用having我必须使用groupby,使用where我不能使用聚合函数和运算符,所以我想要在伪代码中 Select column1,column2,column3 From MYdatabase Where count(column1) > 10 这就是我被卡住的地方。我是否使用子查询并添加名为count的列?我不确定我将如何立即编写代码,因为我是一个SQL初学者,所以我可能会朝着完全错误的

好的,我有超过一百万条记录,我需要从数据库中选择所有信息,其中一列的计数大于或等于10

我知道使用having我必须使用groupby,使用where我不能使用聚合函数和运算符,所以我想要在伪代码中

Select column1,column2,column3
From MYdatabase
Where count(column1) > 10
这就是我被卡住的地方。我是否使用子查询并添加名为count的列?我不确定我将如何立即编写代码,因为我是一个SQL初学者,所以我可能会朝着完全错误的方向看

下面是我的整个查询,如果是这样,我想修改,只选择countcallid>=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列上的所有数据。工作完美无瑕,谢谢大家的帮助

您可以这样做:

Select column1,column2,column3 
From MyTable
Where (Select count(*) From MyTable Group By Column1) > 10 
更具体地说,在您的示例中添加:

AND 
 (SELECT count(*) 
  FROM CMS_ECH.dbo.CaliforniaECH iECH 
  WHERE iECH.callid = ECH.callid) > 10

首先确定哪些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
)
更正:

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

我自己解决了这个问题,使用内部连接查询选择前10名并连接dialed_num列上的所有数据。工作完美无瑕,谢谢大家的帮助

谢谢你的帮助!在查询的底部添加该值会产生以下错误:子查询返回的值超过1。当子查询在=、!=、=或者当子查询用作表达式时。再次感谢,我的查询现在返回0个结果,应该返回140000左右。有趣的是,我之前遇到过这个问题。我使用了HAVING子句:HAVING countcallid>=10,但是我的结果必须分组。我需要单独的行而不是组:我能做些什么来帮助您?谢谢,但这会返回一个错误:在预期条件的上下文中指定的非布尔类型的表达式,接近。是。。。对不起,还有。。。这是您必须从中选择的表。。。我正在纠正它,并将很快发布adaptedOK-现在看起来-不确定是否有一些错误,因为我无法运行查询进行检查,但我检查了一个更简单的结构,具有更少的字段和没有连接,它可以工作。谢谢,但您的查询返回0个结果,其中应该有140000个左右。我之前遇到过这个问题。我使用了HAVING子句:HAVING countcallid>=10,但是我的结果必须分组。我需要单独的行而不是组:我能做些什么来帮助您呢?试着消除一些查询的复杂性,然后首先运行top语句:选择ECH.callid,从CMS_ECH.dbo.CaliforniaECH ECH group by ECH.callid计数>10,验证这是否给出了正确的结果。完成后,只需使用内部查询作为过滤器从ECH进行简单的选择。如果这样做有效,那么问题源于查询的其他部分。您可以一次添加一个连接和where子句,直到结果消失,这将帮助您确定问题的根源。我使用的mysql没有TOP uses限制,但如果我记得清楚,TOP最多选择前10个结果,但如果结果少于10,它将返回所有的呼叫,这样你就不会只选择callid>10的呼叫,所以我认为TOP不可用,但我可能在这一点上错了。不管怎样,我认为使用前10个拨号号码进行连接会将数据限制在拨号次数最多的10个号码内,而不会删除10次以下通话的数据。