2012-12-24 20 views
2

我试图为每个代理表中插入样品的过程,样本的每个代理的#变化的基础上的一些计算来自相同选择语句选择前N个动态用N

Declare @samplesize int 
Declare @Top int 
set @samplesize=0 

;WITH DataToInsert AS 
(
    Select AgentID, Surveys, LOB,(case when day(getdate())<4 then 3 else (day(getdate())) - (Surveys*3) end) SampleSize from Current_Agent_SurveyCount_HSI Where surveys<8 
) 

--Insert Into Survey_Source_New (LOB, CenterName, CallDate, AgentZid, TN, Ticket, RecordingID, Cycle, [TimeStamp]) 
--Select top 5 ss.LOB, CenterName, CallDate, AgentZid, TN, Ticket, RecordingID, Cycle, [TimeStamp] 
--From Survey_source_Level1 ss 
--inner join DataToInsert du on ss.AgentZID=du.agentID 
--where flag is null and du.samplesize>6 
--order by newid() 

Insert Into Survey_Source_New (LOB, CenterName, CallDate, AgentZid, TN, Ticket, RecordingID, Cycle, [TimeStamp]) 
Select top (@Top) @Top=du.samplesize,ss.LOB, CenterName, CallDate, AgentZid, TN, Ticket, RecordingID, Cycle, [TimeStamp] 
From Survey_source_Level1 ss 
inner join DataToInsert du on ss.AgentZID=du.agentID 
where flag is null and du.samplesize<7 
order by newid() 

的错误,我来到这里是

消息4115,15级,状态1,4号线
列“采样大小”的提法没有在TOP子句的参数允许的。这里只允许引用外部 范围的列或独立表达式和子查询。

是否有解决方法?

任何帮助表示赞赏。

在此先感谢。

回答

2

您可以使用row_number()基本上做同样的事情:

WITH DataToInsert AS 
(
    Select AgentID, Surveys, LOB,(case when day(getdate())<4 then 3 else (day(getdate())) - (Surveys*3) end) SampleSize from Current_Agent_SurveyCount_HSI Where surveys<8 
) 
Insert Into Survey_Source_New (LOB, CenterName, CallDate, AgentZid, TN, Ticket, RecordingID, Cycle, [TimeStamp]) 
    select LOB, CenterName, CallDate, AgentZid, TN, Ticket, RecordingID, Cycle, [TimeStamp] 
    from (Select ss.LOB, CenterName, CallDate, AgentZid, TN, Ticket, RecordingID, Cycle, [TimeStamp], 
       row_number() over (order by newid()) as seqnum 
      From Survey_source_Level1 ss inner join 
       DataToInsert du on ss.AgentZID=du.agentID 
      where flag is null and du.samplesize<7 
     ) t 
    where seqnum <= du.sample_size 

您也许能够简化这一点,但我不知道是否flag从杜或SS到来。

+0

工作完美,非常感谢。 – Srijan

0

我在同一个问题上增加了一个场景。 我对现有解决方案进行了一些更改,方案是: 我每天都会收到代理商列表,并且必须向每个代理商发送一组随机调查,计数取决于每个代理商的一些计算。

--Get Agent List 
;WITH AgentsList AS  
( 
    Select AgentID, Surveys, LOB,(case when day(getdate())<4 then 3 else (day(getdate())) - (Surveys*3) end) SampleSize  
    from Current_Agent_SurveyCount_FIOS Where surveys<8  
) 
--Get All the Surveys for each Agent 
, AgentSurveys AS 
(
    select ss.LOB, ss.CenterName, ss.CallDate, ss.AgentZid, ss.TN, ss.Ticket, ss.RecordingID, ss.Cycle, ss.[TimeStamp],ss.Flag,AL.samplesize 
    from Survey_Source_Level1_Sri ss 
    inner join AgentsList AL on ss.AgentZID=AL.agentID 
    where flag is null 
    GROUP BY ss.LOB, ss.CenterName, ss.CallDate, ss.AgentZid, ss.TN, ss.Ticket, ss.RecordingID, ss.Cycle, ss.[TimeStamp],ss.Flag,AL.samplesize 
) 
--Mark random ranking for each survey 
Select LOB, CenterName, CallDate, AgentZid, TN, Ticket, RecordingID, Cycle, [TimeStamp],samplesize,  
      rank() over (partition by agentzid order by newid()) as seqnum  
     From AgentSurveys 
     group by LOB, CenterName, CallDate, AgentZid, TN, Ticket, RecordingID, Cycle, [TimeStamp],samplesize  
     order by agentzid,seqnum,tn 

现在从上次查询我得到一个表像

enter image description here

我需要从每个其中N来自采样大小列组行的N多。

+0

select LOB,CenterName,CallDate,AgentZid,TN,Ticket,RecordingID,Cycle,[TimeStamp],samplesize,seqnum from (Select LOB,CenterName,CallDate,AgentZid,TN,Ticket,RecordingID,Cycle,[TimeStamp],的采样大小, 秩()以上(分区由agentzid为了通过NEWID())用作SEQNUM 从AgentSurveys 组由LOB,CenterName,CallDate,AgentZid,TN,票务,RecordingID,周期,[时间戳],采样大小) 吨 seqnum <= samplesize order by agentzid,seqnum,tn – Srijan

+0

这是解决问题的方法,但是查询的性能意味着什么? – Srijan