Как получить вторую от самых высоких ежемесячных продаж за каждый год - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь получить вторую по величине ежемесячную выручку за каждый год.

Пока я получаю вторую по величине месячную выручку только за первый год.

WITH newtable AS
(
    SELECT 
    MONTH(o.orderdate) AS 'MONTH',
    YEAR(o.orderdate) AS 'YEAR',
    SUM(od.qty*od.unitprice) AS monthSales
    FROM Sales.Orders AS o
    INNER JOIN Sales.OrderDetails AS od
    ON o.orderid = od.orderid
    GROUP BY YEAR(o.orderdate), MONTH(o.orderdate) 
)
SELECT YEAR, MAX(monthSales) AS secondHighestMonthlySales
FROM newtable
WHERE monthSales < (SELECT MAX(monthSales) FROM newtable)
GROUP BY YEAR;

Мне нужно второе место за каждый год.

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

Если у вас правильные данные в newtable, сконцентрируйтесь на втором запросе относительно того, что вы хотите.Это чистый SQL:

Тестовые данные:

Year    Sales
2010    500
2010    400
2010    600
2011    700
2011    800
2011    900
2012    400
2012    600
2012    500

Запрос выбора второго наивысшего значения:

select O.year, max(O.sales) as secondhighestsale from Orders O,
(select year, max(sales) as maxsale
from Orders
group by year) A
where O. year = A.year
and O.sales < A.maxsale
group by O.year

Вывод:

year    secondhighestsale
2010    500
2011    800
2012    500
0 голосов
/ 12 апреля 2019

В качестве альтернативы вы можете использовать функцию ROWNUMBER (). В этом случае я использую общее табличное выражение. Мы находим второе место по количеству продаж за каждый год. Эти годы являются так называемыми перегородками.

USE TEMPDB

CREATE TABLE #Sales (SalesYear INT, TotalAmount INT)
INSERT INTO #Sales VALUES (2016, 1100), (2016, 700), (2016, 950),
                          (2017, 660), (2017, 760), (2017, 460),
                          (2017, 141), (2018, 999), (2018, 499);

WITH CTE AS 

(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY SalesYear ORDER BY TotalAmount DESC) AS RowNumb 
    FROM #Sales
)

SELECT SalesYear,
      TotalAmount
FROM CTE WHERE RowNumb = 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...