2012-02-09 3 views
1

Я пытаюсь выбрать все данные комиссии для одного из счетов-фактур, которые будут платить комиссионные за наибольшее количество продавцов. (Для каждого счета-фактуры могут быть оплачены несколько комиссионных.) У меня есть только таблица CommissionReport, в которой указаны комиссионные для каждого продавца по каждому счету.Упростить вложенные подзапросы, содержащие агрегаты

invoice_number  salesperson_id commission_amt 
---------------- ---------------- ---------------- 
      1001 Bob       30.00 
      1002 Alison      64.50 
      1002 Charlie      110.25 

Этот код работает отлично, но мой subconcious кричит, что мне не нужно, чтобы гнездо подзапросы три глубокие. Может кто-то, пожалуйста, выпрями меня?

select 

    invoice_number, 
    salespeson_id, 
    commission_amt 

from 

    CommissionReport CR 

    join 

    ( select top 1 invoice_number 
     from  CommissionReport CR2 
     group by CR2.invoice_number 
     having count(*) = 

     ( select max(CR3.cnt) 
      from  

      ( select invoice_number, 
          cnt = count(*) 
       from  CommissionReport CR4 
       group by invoice_number 
      ) CR3 

     ) 

    ) CR2 on CR2.invoice_number = CR.invoice_number 

Большое спасибо за внимание.

Скотт

ответ

1

Я не понимаю требование, и это мой первый запрос в Mssql ... но проверить, работает ли это:

select cr.invoice_number, cr.salesperson_id, cr.commission_amt 
from CommissionReport CR 
where cr.invoice_number in (
    select top 1 invoice_number 
    from CommissionReport CR2 
    group by CR2.invoice_number 
    order by count(*) desc 
) 
+0

Видимо вы СДЕЛАЛИ понять требование, и вы прибили код. Это делает именно то, что я хотел. Огромное спасибо. – Scott

+0

Похоже, вы передумали, установив этот ответ правильно (да, stackoverflow продал вас: P). Было ли что-то не так с запросом? –

+1

Нет, ничего страшного. Ваш код работает нормально. Просто хотел посмотреть, есть ли у кого-нибудь еще что-нибудь по этому поводу. Наверное, нет. Я хотел бы упомянуть, что некоторые SQL-кодеры, возможно, предложили помещать подзадачу в соединение, а не в предложение where. На самом деле так я предпочитаю - может быть, это не имеет значения. Еще раз спасибо за ваше решение. – Scott

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