Условный Макс в SQL - PullRequest
       12

Условный Макс в SQL

3 голосов
/ 18 июня 2011

Мне нужно следующий запрос в SQL Server:

SELECT EmployeeID, 
       TotalQuantity AS TotalQty, 
       TotalSales, 
       MAX(CASE WHEN MonthNumber = MAX(MonthNumber)
           THEN TotalSales END) as RecentMonthSale
FROM vwSales 
GROUP BY EmployeeID, TotalQuantity , TotalSales

Бу это дает мне ошибку:

Cannot perform an aggregate function on an expression
containing an aggregate or a subquery.

Вид ввода выглядит следующим образом:

EmployeeID    TotaSales MonthNumber
  1             4000      1
  1             6000      2
  2             8500      1
  2             6081      2 

Желаемый вывод:

EmployeeID    TotalSale     RecentMonthSale
  1            10000            6000
  2            14581            6081
  3            11458            1012 

Я хочу следующий столбец в моем выводе EmployeeID, TotalQuantity TotalSale RecentMonthSale Мое представление имеет следующий столбец EmployeeID TotalSale,TotalQuantity, MonthNumber.

Ответы [ 2 ]

2 голосов
/ 18 июня 2011

Этот запрос покажет нужный вам вывод и отсканирует таблицу только один раз.

select EmployeeID, sum(TotalSales), sum(case when MaxMonth = 1 then TotalSales else 0 end) RecentMonthSales
from 
(
    select *, rank() over(order by MonthNumber desc) MaxMonth
    from
    (
        select EmployeeID, MonthNumber, sum(TotalSales) TotalSales
        from vwSales
        group by EmployeeID, MonthNumber
    ) tt
) tt
group by EmployeeID
0 голосов
/ 18 июня 2011
SELECT
    vw.EmployeeID,
    SUM(vw.TotalSale) as Total,
    Recent.RecentMonthSale
FROM
    vwSales vw
    LEFT JOIN
    (
        SELECT
            _vw.EmployeeID,
            _vw.TotalSale as RecentMonthSale
        FROM
            vwSales _vw
        INNER JOIN
        (
            SELECT EmployeeID, MAX(MonthNumber) as MaxMonth
            FROM vwSales
            GROUP BY EmployeeID
        ) _a
        on _vw.EmployeeID = _a.EmployeeID
        and _vw.MonthNumber = _a.MaxMonth
    ) Recent
    on Recent.EmployeeID = vw.EmployeeID
GROUP BY
    vw.EmployeeID,
    Recent.RecentMonthSale

Если вы просто выполните каждый из подзапросов и просмотрите их результаты, вы должны получить хорошее представление о том, как это работает

...