Я буду использовать T-SQL.Преобразовать T-SQL в другие диалекты SQL просто.
Во-первых, давайте получим общий доход по каждому заказу, сгруппировав все OrderDetails
по OrderNumber
и SUM
по их стоимости:
SELECT
OrderNumber,
SUM( QuantityOrdered * PriceEach ) AS OrderValue
FROM
OrderDetails
GROUP BY
OrderNumber
Это дает нам этот вывод:
OrderNumber OrderValue
1 123.00
2 456.00
3 50.00
4 1024.00
Затем JOIN
это с Orders
, чтобы получить их OrderDate
:
SELECT
Orders.OrderNumber,
Orders.OrderDate,
COALESCE( ov.OrderValue, 0 ) AS OrderValue
FROM
OrderDetails
LEFT OUTER JOIN
(
SELECT
OrderNumber,
SUM( QuantityOrdered * PriceEach ) AS OrderValue
FROM
OrderDetails
GROUP BY
OrderNumber
) AS ov ON ov.OrderNumber = Orders.OrderNumber
Это дает нам этот вывод:
OrderNumber OrderDate OrderValue
1 2018-02-03 123.00
2 2018-05-09 456.00
3 2018-02-04 50.00
4 2018-06-08 1024.00
Затем мы хотим сгруппировать строки по их месяцу (кортежу года и месяца) и найти SUM
из OrderValue
в каждой группе.Мы можем отбросить столбец OrderNumber
, так как он больше не нужен.Мы также можем добавить COUNT
тоже.Тогда ORDER BY
SUM
SELECT
YEAR( Orders.OrderDate ) AS [Year],
MONTH( Orders.OrderDate ) AS [Month],
COUNT( * ) AS [OrderCount],
SUM( COALESCE( ov.OrderValue, 0 ) ) AS RevenueInMonth
FROM
OrderDetails
LEFT OUTER JOIN
(
SELECT
OrderNumber,
SUM( QuantityOrdered * PriceEach ) AS OrderValue
FROM
OrderDetails
GROUP BY
OrderNumber
) AS ov ON ov.OrderNumber = Orders.OrderNumber
GROUP BY
YEAR( Orders.OrderDate ),
MONTH( Orders.OrderDate )
ORDER BY
RevenueInMonth DESC
Это дает нам такой вывод:
Year Month OrderCount RevenueInMonth
2018 6 1 1024.00
2018 5 1 456.00
2018 2 2 173.00