2

各エージェントのテーブルにサンプルを挿入しようとする手順があります。各エージェントのサンプル数は、いくつかの計算に基づいて異なります

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 句の引数では、列 "samplesize" への参照は許可されていません。ここでは、外側のスコープまたはスタンドアロンの式とサブクエリでの列への参照のみが許可されます。

これに対する回避策はありますか?

どんな助けでも大歓迎です。

前もって感謝します。

4

2 に答える 2

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これを少し単純化できるかもしれませんが、がdu から来ているのか ss から来ているのかわかりません。

于 2012-12-24T20:31:41.580 に答える
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

最後のクエリから、次のようなテーブルを取得します

ここに画像の説明を入力

N が SampleSize 列に由来する各グループから N 個の行が必要です。

于 2012-12-26T05:44:58.437 に答える