2012-12-24 22 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