2012-02-12 3 views
1

этот запрос возвращает 125000 итог для [Specimen ID]Почему эти два запроса возвращают разные значения?

; with cte (rejected) as 
(

select distinct([specimen id]) 
from QuickLabDump 
where DATEPART(mm, [DATE entered]) = 01 
and DATEPART(yyyy, [DATE entered]) = 2012 
and QuickLabDump.Outcome='REJECTED' 

) 


    select [Specimen ID],max([Order Count]) from QuickLabDump 
    left outer join cte 
    on QuickLabDump.[Specimen ID]=cte.rejected 
    where DATEPART(mm, [DATE entered]) = 01 
    and DATEPART(yyyy, [DATE entered]) = 2012 
    and cte.rejected is null 
    group by [Specimen ID] 
    order by 2 desc 

а если я сделать то же самое количество на Specimen ID здесь, я получаю около 127000:

; with cte (rejected) as 
(

select distinct([specimen id]) 
from QuickLabDump 
where DATEPART(mm, [DATE entered]) = 01 
and DATEPART(yyyy, [DATE entered]) = 2012 
and QuickLabDump.Outcome='REJECTED' 

) 

select 
    [Full Date]=CONVERT(VARCHAR(8), [DATE entered], 1), 
    [Year Entered]=DATEPART(yy, [DATE entered]) , 
    [Month Entered]=LEFT(DATENAME(MONTH, [DATE entered]), 3), 
    [Day Entered]=DATEPART(dd, [DATE entered]), 
    [DOW]= 
     case when DATEPART(WEEKDAY, [DATE entered])=1 THEN 'Sun' 
     when DATEPART(WEEKDAY, [DATE entered])=2 THEN 'Mon' 
     when DATEPART(WEEKDAY, [DATE entered])=3 THEN 'Tus' 
     when DATEPART(WEEKDAY, [DATE entered])=4 THEN 'Wed' 
     when DATEPART(WEEKDAY, [DATE entered])=5 THEN 'Thu' 
     when DATEPART(WEEKDAY, [DATE entered])=6 THEN 'Fri' 
     when DATEPART(WEEKDAY, [DATE entered])=7 THEN 'Sat' 
     end, 
    [Week Ending]=CONVERT(VARCHAR(8), 
     DATEADD (D, -1 * DatePart (dw,[date entered]) + 6, [date entered]), 1), 
    [CountAccns]=count(a.[specimen id]), 
    [Sales Rep]=c.salesrep, 
    [MLNPI]=c.npi, 
    [IMSNPI]=e.npib, 
    [IMS Specialty Primary Code]=e.SpecialtyPrimaryCodeb, 
    [IMS Specialty Secondary Code]=e.SpecialtySecondaryCodeb, 
    [IMS Specialty Tertiary Code]=e.SpecialtyTertiaryCodeb, 
    [IMS Professional ID 1]=e.ProfessionalID1b,  
    [Physician]=[Requesting Physician], 
    [Practice Code]=a.[practice code], 
    [MLIS Code]=b.[mlis practice id],  
    [practice name], 
    [Date Established]=c.dateestablished , 
    [Address]=c.practiceaddress1, 
    [Address2]=c.practiceaddress2, 
    [City]=c.practicecity, 
    [State]=c.practicestate, 
    [Status]=b.[Active Inactive], 
    [order count]=a.[order count] 
from 
    quicklabdump a 
    left outer join qlmlismapping b on (b.[practice code] = a.[practice code]) 
    left outer join PracticeandPhysician c on 
     a.[Requesting Physician]=c.doctorfirstname+' '+c.DOCTORLASTNAME 
     and a.[practice code]=c.practicecode 
    left outer join IMSData e on c.NPI=e.npib 
    left outer join cte 
     on a.[Specimen ID]=cte.rejected 

where  
    DATEPART(mm, [DATE entered]) = 01 
    and DATEPART(yyyy, [DATE entered]) = 2012 
    and cte.rejected is null 

group by 
    a.[DATE entered], 
    c.salesrep, 
    c.npi, 
    e.npib, 
    e.SpecialtyPrimaryCodeb, 
    e.SpecialtySecondaryCodeb, 
    e.SpecialtyTertiaryCodeb, 
    e.ProfessionalID1b, 
    a.[Requesting Physician], 
    a.[practice code], 
    b.[mlis practice id], 
    [practice name], 
    c.dateestablished , 
    c.practiceaddress1, 
    c.practiceaddress2, 
    c.practicecity, 
    c.practicestate, 
    b.[Active Inactive], 
    a.[order count] 
having a.[order count]=max([order count]) 
    order by [Practice Code] desc,Physician desc 

почему существует такая огромная разница с графом ? разве вы не думаете, что это будет точно так же, поскольку оба запроса должны возвращать одинаковое общее количество Specimen IDs?

что я делаю неправильно?

ответ

0

Я нашел виновника!

Во втором запросе я делал [CountAccns]=count(a.[specimen id]),

это на самом деле должно было быть:

[CountAccns]=count(distinct(a.[specimen id])), 

два на счету в настоящее время выстроились !!

1

Сразу я вижу несколько факторов, которые могут быть причиной различных счетчиков записей между двумя запросами:

  1. В своем первом запросе вы только группировка по SpecimenID во втором запросе вы группирование многих больше атрибутов.
  2. Ваш второй запрос включает в себя несколько дополнительных объединений, которые могут легко привести к иному результату считает
  3. Ваш второй запрос включает в себя Having предикат, который делает первый запрос не
+0

Большое вам спасибо за ваш ответ! не могли бы вы рассказать мне, почему группировка по другим атрибутам меняет результат? –

+0

да есть дополнительные объединения, но все они ЛЕВЫЕ ВНЕШНИЕ СОЕДИНЕНИЯ и просто возвращают NULL, если нет данных –

+0

первый запрос выбирает идентификатор образца и max ([Order Count]), предложение having во втором запросе делает то же самое не так ли? - Еще раз спасибо за ваш вклад и помогите –

1

Является ли [образец ID] обнуляемым? Если это так, я хотел бы попробовать следующее в обоих запросах:

  1. Set ansi_nulls on
  2. Для КТР в обеих запросах добавить AND [specimen id] IS NOT NULL
  3. В первом запросе псевдоним QuickLabDump в a
  4. Удалить left outer join cte... (оба запроса)
  5. Убрать and cte.rejected is null (оба запроса)
  6. Добавить and not exists(select 1 from cte where [specimen id]=a.[specimen id]) в теги, где указаны оба основных запроса s.

Обновленный код следует

-- First Query 
set ansi_nulls on 

; with cte (rejected) as 
( 
    select distinct([specimen id]) 
    from QuickLabDump 
    where DATEPART(mm, [DATE entered]) = 01 
    and DATEPART(yyyy, [DATE entered]) = 2012 
    and QuickLabDump.Outcome='REJECTED' 
    and [specimen id] is not null 
) 
select [Specimen ID],max([Order Count]) 
from QuickLabDump a 
where DATEPART(mm, [DATE entered]) = 01 
and DATEPART(yyyy, [DATE entered]) = 2012 
and not exists(select 1 from cte where rejected=a.[Specimen ID]) 
group by [Specimen ID] 
order by 2 desc 
go 

-- Second Query 
set ansi_nulls on 
; with cte (rejected) as 
( 
    select distinct([specimen id]) 
    from QuickLabDump 
    where DATEPART(mm, [DATE entered]) = 01 
    and DATEPART(yyyy, [DATE entered]) = 2012 
    and QuickLabDump.Outcome='REJECTED' 
    and [specimen id] is not null 
) 
select 
    [Full Date]=CONVERT(VARCHAR(8), [DATE entered], 1), 
    [Year Entered]=DATEPART(yy, [DATE entered]) , 
    [Month Entered]=LEFT(DATENAME(MONTH, [DATE entered]), 3), 
    [Day Entered]=DATEPART(dd, [DATE entered]), 
    [DOW]= 
     case when DATEPART(WEEKDAY, [DATE entered])=1 THEN 'Sun' 
     when DATEPART(WEEKDAY, [DATE entered])=2 THEN 'Mon' 
     when DATEPART(WEEKDAY, [DATE entered])=3 THEN 'Tus' 
     when DATEPART(WEEKDAY, [DATE entered])=4 THEN 'Wed' 
     when DATEPART(WEEKDAY, [DATE entered])=5 THEN 'Thu' 
     when DATEPART(WEEKDAY, [DATE entered])=6 THEN 'Fri' 
     when DATEPART(WEEKDAY, [DATE entered])=7 THEN 'Sat' 
     end, 
    [Week Ending]=CONVERT(VARCHAR(8), 
     DATEADD (D, -1 * DatePart (dw,[date entered]) + 6, [date entered]), 1), 
    [CountAccns]=count(a.[specimen id]), 
    [Sales Rep]=c.salesrep, 
    [MLNPI]=c.npi, 
    [IMSNPI]=e.npib, 
    [IMS Specialty Primary Code]=e.SpecialtyPrimaryCodeb, 
    [IMS Specialty Secondary Code]=e.SpecialtySecondaryCodeb, 
    [IMS Specialty Tertiary Code]=e.SpecialtyTertiaryCodeb, 
    [IMS Professional ID 1]=e.ProfessionalID1b,  
    [Physician]=[Requesting Physician], 
    [Practice Code]=a.[practice code], 
    [MLIS Code]=b.[mlis practice id],  
    [practice name], 
    [Date Established]=c.dateestablished , 
    [Address]=c.practiceaddress1, 
    [Address2]=c.practiceaddress2, 
    [City]=c.practicecity, 
    [State]=c.practicestate, 
    [Status]=b.[Active Inactive], 
    [order count]=a.[order count] 
from 
    quicklabdump a 
    left outer join qlmlismapping b on (b.[practice code] = a.[practice code]) 
    left outer join PracticeandPhysician c on 
     a.[Requesting Physician]=c.doctorfirstname+' '+c.DOCTORLASTNAME 
     and a.[practice code]=c.practicecode 
    left outer join IMSData e on c.NPI=e.npib 
where  
    DATEPART(mm, [DATE entered]) = 01 
    and DATEPART(yyyy, [DATE entered]) = 2012 
    and cte.rejected is null 
    and not exists(select 1 from cte where rejected=a.[Specimen ID]) 
group by 
    a.[DATE entered], 
    c.salesrep, 
    c.npi, 
    e.npib, 
    e.SpecialtyPrimaryCodeb, 
    e.SpecialtySecondaryCodeb, 
    e.SpecialtyTertiaryCodeb, 
    e.ProfessionalID1b, 
    a.[Requesting Physician], 
    a.[practice code], 
    b.[mlis practice id], 
    [practice name], 
    c.dateestablished , 
    c.practiceaddress1, 
    c.practiceaddress2, 
    c.practicecity, 
    c.practicestate, 
    b.[Active Inactive], 
    a.[order count] 
having a.[order count]=max([order count]) 
    order by [Practice Code] desc,Physician desc 
go 
+0

Большое спасибо за вашу помощь, можете ли вы показать мне результирующий запрос? –

+0

Обновленный код, добавленный выше –

+0

, ваш запрос дал те же точные результаты, что и мой запрос –

Смежные вопросы