Как добавить значение агрегатной функции в предложении where? - PullRequest
1 голос
/ 16 мая 2019

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

SELECT 
CardCode,
CardName,
Sum(case when Year(DocDate)='2018' then DocTotal else 0 end) as Sold2018,
Sum(case when Year(DocDate)='2019' then DocTotal else 0 end) as Sold2019
FROM
ORDR
***where Sold2018 < Sold2019***
Group By
CardCode,
CardName

Ответы [ 3 ]

3 голосов
/ 16 мая 2019

Используйте having предложение:

SELECT 
  CardCode,
  CardName,
  Sum(case when Year(DocDate)='2018' then DocTotal else 0 end) as Sold2018,
  Sum(case when Year(DocDate)='2019' then DocTotal else 0 end) as Sold2019
FROM ORDR
Group By CardCode, CardName
having Sum(case when Year(DocDate)='2018' then DocTotal else 0 end) < Sum(case when Year(DocDate)='2019' then DocTotal else 0 end)

или используйте подзапрос и where предложение:

select *
from (
    SELECT 
      CardCode,
      CardName,
      Sum(case when Year(DocDate)='2018' then DocTotal else 0 end) as Sold2018,
      Sum(case when Year(DocDate)='2019' then DocTotal else 0 end) as Sold2019
    FROM ORDR
    Group By CardCode, CardName
) where Sold2018 < Sold2019
0 голосов
/ 16 мая 2019

Вы можете использовать в качестве ответа Shawn.X .Запрос может быть написан более читабельно с использованием общей таблицы и предложения where.

with totalOf2018 as (
select  CardCode, CardName, Sum(DocTotal) as Sold2018,
from  ORDR   
where Year(DocDate)='2018'
Group By CardCode, CardName
), totalOf2019 as(
select  CardCode, CardName, Sum(DocTotal) as Sold2019,
from  ORDR   
where Year(DocDate)='2019'
Group By CardCode, CardName
)
select 
a.CardCode, a.CardName, a.Sold2018, b.Sold2019
from totalOf2018 a
join totalOf2019  b on a.CardCode = b.CardCode and a.CardName = b.CardName
where a.Sold2018 < b.Sold2019
0 голосов
/ 16 мая 2019

Просто используйте HAVING, как показано ниже:

SELECT 
    CardCode,
    CardName,
    Sum(case when Year(DocDate)='2018' then DocTotal else 0 end) as Sold2018,
    Sum(case when Year(DocDate)='2019' then DocTotal else 0 end) as Sold2019
FROM
    ORDR
Group By
    CardCode,
    CardName
having(Sum(case when Year(DocDate)='2018' then DocTotal else 0 end) < Sum(case when Year(DocDate)='2019' then DocTotal else 0 end))
...