SQL-запрос производит повторяющиеся строки, и я не могу понять, почему - PullRequest
2 голосов
/ 17 июля 2010

Мой запрос всегда дает повторяющиеся результаты.Как лучше всего устранить неполадки в этом запросе с базой данных> 1 миллиона строк.

Select segstart
    ,segment
    ,callid
    ,Interval
    ,dialed_num
    ,FiscalMonthYear
    ,SegStart_Date
    ,row_date
    ,Name
    ,Xferto
    ,TransferType
    ,Agent
    ,Sup
    ,Manager
    ,'MyCenter' = Case 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
    ,Xferfrom
    ,talktime
    ,ANDREWSTABLE.transferred
    ,ANDREWSTABLE.disposition
    ,dispsplit
    ,callid
    ,hsplit.starttime
    ,CASE
    WHEN hsplit.callsoffered > 0 
    THEN (CAST(hsplit.acceptable as DECIMAL)/hsplit.callsoffered)*100
    ELSE '0'
    END AS 'Service Level'
    ,hsplit.callsoffered
    ,hsplit.acceptable
FROM
(
Select segstart,
    100*DATEPART(HOUR, segstart) + 30*(DATEPART(MINUTE, segstart)/30) as Interval,
    FiscalMonthYear,
    SegStart_Date,
    dialed_num,
    callid,
    Name,
    t.Queue AS 'Xferto',
    TransferType,
    RepLName+', '+RepFName AS Agent,
    SupLName+', '+SupFName AS Sup,
    MgrLName+', '+MgrFName AS Manager,
    q.Center,
    q.Queue AS 'Xferfrom',
    e.anslogin,
    e.origlogin,
    t.Extension,
    transferred,
    disposition,
    talktime,
    dispsplit,
    segment
From CMS_ECH.dbo.CaliforniaECH e

INNER JOIN Cal_RemReporting.dbo.TransferVDNs t on e.dialed_num = t.Extension
INNER JOIN InfoQuest.dbo.IQ_Employee_Profiles_v3_AvayaId q on e.origlogin = q.AvayaID
INNER JOIN Cal_RemReporting.dbo.udFiscalMonthTable f on e.SegStart_Date = f.Tdate

Where SegStart_Date between getdate()-90 and getdate()-1
    And q.Center not in ('Collections Center',
                         'Cable Store',
                         'Business Services Center',
                         'Escalations')
    And SegStart_Date between RepToSup_StartDate and RepToSup_EndDate
    And SegStart_Date between SupToMgr_StartDate and SupToMgr_EndDate
    And SegStart_Date between Avaya_StartDate and Avaya_EndDate
    And SegStart_Date between RepQueue_StartDate and RepQueue_EndDate
    AND (e.transferred like '1'
    OR e.disposition like '4') order by segstart
) AS ANDREWSTABLE

--Left Join CMS_ECH.dbo.hsplit hsplit on hsplit.starttime = ANDREWSTABLE.Interval and hsplit.row_date = ANDREWSTABLE.SegStart_Date and ANDREWSTABLE.dispsplit = hsplit.split

Ответы [ 2 ]

6 голосов
/ 17 июля 2010

Существует две возможности:

  1. В вашей системе есть несколько записей, которые будут создавать дублирующиеся строки в вашем наборе результатов, потому что ваша проекция не выбирает достаточные столбцы, чтобы различать их или ваше предложение whereне отфильтровывает их.
  2. Ваши объединения генерируют ложные дубликаты, поскольку предложения ON не завершены.

Оба из них могут быть решены только кем-то с требуемым уровнембазовые знания.Поэтому мы не собираемся исправлять этот запрос для вас.Извините.

Что вам нужно сделать, так это сопоставить некоторые повторяющиеся результаты с некоторыми не дублирующими результатами и выяснить, что общего у первой группы, что также отличает ее от второй группы.

Я не говорю, что это легко, особенно с миллионами строк.Но если бы это было легко, это не стоило бы делать.

3 голосов
/ 17 июля 2010

Я сам в этом участвовал пару раз, и это всегда заканчивалось одним из моих заявлений о присоединении.Я бы попытался удалить ваши операторы объединения по одному и посмотреть, уменьшит ли удаление одного из них количество дубликатов.

Другой вариант - найти дублирующийся набор строк и запросить каждую таблицу в объединении наобъедините значения и посмотрите, что вы получите.

Кроме того, какую базу данных вы используете и какую версию?

...