2014-09-29 3 views
0

Я борющиеся с элегантным решением для этого на некоторое время, и думали, что я наконец-то взломал, но я теперь получаю ошибкуНесколько столбцов в агрегированном выражении

Несколько столбцов указаны в агрегированном выражение, содержащее внешнюю ссылку. Если агрегированное выражение содержит внешнюю ссылку, то эта внешняя ссылка должна быть единственным столбцом, на который ссылается выражение.

Что меня разочарует!

По существу запроса:

select 
u.username + ' ' + u.surname, 
CASE WHEN ugt.type = 'Contract' 
    THEN 
    (
     select sum(dbo.GET_INVOICE_WEEKLY_AVERAGE_VALUE(pc.placementid, u.UserId)) 
       from PlacementConsultants pc 
       where pc.UserId = u.UserId 
       and pc.CommissionPerc >= 80 
    ) 
    END 
from usergradetypes ugt 
inner join usergrades ug on ug.gradeid = ugt.usergradetypeid 
inner join users u on u.userid = ug.userid 

Функция GET_INVOICE_WEEKLY_AVERAGE_VALUE выглядит следующим образом

ALTER function [dbo].[GET_INVOICE_WEEKLY_AVERAGE_VALUE](@placementid INT, @userid INT) 
RETURNS numeric(9,2) 
AS 
BEGIN 

    DECLARE @retVal numeric(9,2) 
    DECLARE @rollingweeks int 

    SET @rollingweeks = (select ISNULL(rollingweeks,26) FROM UserGradeTypes ugt 
          inner join UserGrades ug on ugt.UserGradeTypeID = ug.gradeid 
          WHERE ug.userid = @userid) 
    SELECT @retVal = 
       sum(dbo.GET_INVOICE_NET_VALUE(id.InvoiceId))/@rollingweeks from PlacementInvoices pli 
inner join invoicedetails id on id.invoiceid = pli.InvoiceId 
where pli.PlacementID = @placementid 
and pli.CreatedOn between DATEADD(ww,[email protected],getdate()) and GETDATE() 


RETURN @retVal 

Запрос прекрасно работает без суммы, но когда я пытаюсь суммировать стоимость сделок , это падает (что мне нужно сделать для сводной страницы)

+0

http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem – Mihai

+1

Что произойдет, если вы замените 'u.UserId' на' pc.UserId' в вызове функции? –

+0

@Mihai Достаточно честный, но я не понимаю, почему, когда я запускаю функцию, я не могу просто сделать на нее сумму? – franglais

ответ

1

Это слишком длинный комментарий. Я не знаю, почему это не удается:

select sum(dbo.GET_INVOICE_WEEKLY_AVERAGE_VALUE(pc.placementid, u.UserId)) 

, но это работает:

select sum(dbo.GET_INVOICE_WEEKLY_AVERAGE_VALUE(pc.placementid, pc.UserId)) 

Любопытно и кажется как ошибка для меня.

сообщения об ошибке, однако, предполагает, что все столбцы внутри sum() должны исходить от либо внешних ссылочных таблиц или внутренних ссылок таблицы, но не оба. Я не понимаю причину этого. Лучше всего предположить, что смешивание двух типов ссылок смущает оптимизатор.

Я еще не видел это сообщение об ошибке, кстати.

EDIT:

Это очень легко воспроизвести, и не требует вызова функции:

with t as (select 1 as col) 
    select t.*, 
      (select sum(t2.col + t.col) from t t2) as newcol 
    from t; 

Очень интересно. Я думаю, что это может нарушить стандарт. Эквивалентный запрос выполняется в Oracle.

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