sql - не может использовать SUM 'для выражения, содержащего совокупность или подзапрос' - PullRequest
1 голос
/ 22 августа 2011

У меня есть приведенный ниже код, который выдает от 1 до 3 результатов каждый раз.

Однако мне бы хотелось иметь общее значение (до) трех результатов, а не указывать их в списке.

Я не могу просто обернуть всю кодировку в select sum (), не получив вышеуказанную ошибку

Любая помощь, чрезвычайно оцененная

-

select 
case when sum(w.Value) > 3*sum(isnull (m.FFT1*m.FFL3V,0)
                        + isnull (m.FFT2*m.FFL3HCV,0)
                        + isnull (m.FFT3*m.FFFinanceSettleV,0)
                        + isnull (m.FFT4*m.FFFinanceSettleHCV,0)
                        + isnull (m.FFT5*m.FFL4V,0) 
                        + isnull (m.FFT6*m.FFL4HCV,0))
                        /count(w.ptmatter)

    then CAST (SUM(w.Value) AS NUMERIC(38,2))

else (
      select sum (isnull (m.FFT1*m.FFL3V,0) 
                 + isnull (m.FFT2*m.FFL3HCV,0)
                 + isnull (m.FFT3*m.FFFinanceSettleV,0)
                 + isnull (m.FFT4*m.FFFinanceSettleHCV,0)
                 + isnull (m.FFT5*m.FFL4V,0) 
                 + isnull (m.FFT6*m.FFL4HCV,0)) 
                 / count(w.ptmatter)) 
end

from dbo.workinprogress as w 
full join dbo.matterdatadef as m 
on (w.ptmatter = m.ptmatter) 
where (w.time <> 0) 
and  (w.ptclient= 
                 (select top 1 ptclient from workinprogress 
                                        where ptmatter=$matter$))
                                        and (m.lsccert = 
                                                      (select lsccert 
                                                      from matterdatadef 
                                                      where ptmatter=$matter$)
                                                      or (m.ptmatter=$matter$))
group by m.ptmatter 

1 Ответ

3 голосов
/ 22 августа 2011

Как насчет упаковки всего этого в подзапрос?

SELECT SUM(v) FROM (
    select case when sum(w.Value) > 
        3*sum (
            isnull (m.FFT1*m.FFL3V,0) + 
            isnull (m.FFT2*m.FFL3HCV,0) +
            isnull (m.FFT3*m.FFFinanceSettleV,0) + 
            isnull (m.FFT4*m.FFFinanceSettleHCV,0) + 
            isnull (m.FFT5*m.FFL4V,0) + 
            isnull (m.FFT6*m.FFL4HCV,0)
        )/count(w.ptmatter)

    then CAST (SUM(w.Value) AS NUMERIC(38,2)) 
    else (
        select sum (
            isnull (m.FFT1*m.FFL3V,0) +
            isnull (m.FFT2*m.FFL3HCV,0) + 
            isnull (m.FFT3*m.FFFinanceSettleV,0) + 
            isnull (m.FFT4*m.FFFinanceSettleHCV,0) + 
            isnull (m.FFT5*m.FFL4V,0) + 
            isnull (m.FFT6*m.FFL4HCV,0)
        ) / count(w.ptmatter)) 
    end AS v

    from dbo.workinprogress as w 
    full join dbo.matterdatadef as m 
    on (w.ptmatter = m.ptmatter) 

    where (w.time <> 0) 
    and  (w.ptclient = (select top 1 ptclient from workinprogress where ptmatter=$matter$)) 
    and (m.lsccert = (select lsccert from matterdatadef where ptmatter=$matter$) 
    or (m.ptmatter=$matter$))

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