Список людей, которые отвечают определенным условиям - PullRequest
0 голосов
/ 18 мая 2019

Мне нужен список клиентов, которые купили товары в данном году на общую сумму, превышающую 80% от наибольшей общей суммы в данном году.У меня есть список всех людей и их общая сумма за каждый год, но я не знаю, как я могу отфильтровать его.Я пытался использовать функцию MAX и использовать максимальную сумму, но она не работает или я делаю это неправильно.Мой текущий запрос:

SELECT (p.LastName + ' ' + p.FirstName) AS 'Customer', s.CustomerID AS 'CustomerId',    YEAR(s.OrderDate) AS Rok, SUM(s.SubTotal) AS 'Amount', COUNT(*) AS 'number of purchases'

FROM Sales.SalesOrderHeader s JOIN Sales.Customer c ON s.CustomerID = c.CustomerID
JOIN Person.Person p ON c.PersonID = p.BusinessEntityID

GROUP BY s.CustomerID,  YEAR(s.OrderDate), p.LastName, p.FirstName

ORDER BY  s.CustomerID, YEAR(s.OrderDate);

Ответы [ 2 ]

2 голосов
/ 18 мая 2019

Вы можете использовать подзапрос для фильтрации

SELECT * FROM (SELECT (p.LastName + ' ' + p.FirstName) AS 'Customer',
s.CustomerID AS 'CustomerId',    YEAR(s.OrderDate) AS Rok, 
SUM(s.SubTotal) AS 'Amount', COUNT(*) AS 'number of purchases'
FROM Sales.SalesOrderHeader s JOIN Sales.Customer c 
ON s.CustomerID = c.CustomerID
JOIN Person.Person p ON c.PersonID = p.BusinessEntityID
GROUP BY s.CustomerID,  YEAR(s.OrderDate), p.LastName, p.FirstName
ORDER BY  s.CustomerID, YEAR(s.OrderDate)) z 
WHERE z.Amount>80;

Логика, которую вам нужно реализовать, может быть записана в предложении where, это пример фильтра, который я использовал

1 голос
/ 18 мая 2019

Если я правильно понимаю ваш вопрос, все будет в порядке:

with cte as (
SELECT 
    (p.LastName + ' ' + p.FirstName) AS 'Customer', s.CustomerID AS 'CustomerId',    YEAR(s.OrderDate) AS Rok, SUM(s.SubTotal) AS 'Amount', COUNT(*) AS 'number of purchases'
FROM Sales.SalesOrderHeader s JOIN Sales.Customer c ON s.CustomerID = c.CustomerID
JOIN Person.Person p ON c.PersonID = p.BusinessEntityID
GROUP BY s.CustomerID,  YEAR(s.OrderDate), p.LastName, p.FirstName
), Max80Percent as 
(
    select 
         *
        ,0.8 * MAX(Amount) OVER (PARTITION BY Rok) as Threshold
    from cte
)
select
    *
from Max80Percent
where Amount > Threshold
...