почему эти два запроса возвращают разные значения? - PullRequest
1 голос
/ 12 февраля 2012

этот запрос возвращает 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?

что я делаю не так?

Ответы [ 3 ]

1 голос
/ 12 февраля 2012

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

  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]) к предложениям where в обоих основных запросах.

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

-- 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  
1 голос
/ 12 февраля 2012

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

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

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

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

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

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

два счета теперь выстроены в ряд !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...