Ранжирование месяцев по сумме дохода, сгенерированного SQL - PullRequest
0 голосов
/ 26 ноября 2018

Две таблицы, с которыми я работаю:

Orderdetails
ordernumber, productnumber, productcode, quantityordered, priceEach

Orders
ordernumber, orderdate (labeled as yyyy-mm-dd)

Я понимаю, как получить доход Sum( quantityOrdered * priceEach ) as TotalRevenue.

С трудностями при группировании по месяцам и объединении двух таблиц.

Спасибо

Ответы [ 3 ]

0 голосов
/ 26 ноября 2018

Я буду использовать 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
0 голосов
/ 26 ноября 2018

Вы можете использовать группирование по month и year функциям вместе как

select concat(month(orderdate),'/',year(orderdate)) as term,
       Sum( quantityOrdered * priceEach ) as TotalRevenue
  from Orders o
  left join Orderdetails d on o.ordernumber = d.ordernumber
 group by term;

Rextester Demo

0 голосов
/ 26 ноября 2018

В стандартном SQL вы должны сделать следующее:

select extract(year from o.orderdate) as yyyy,
       extract(month from o.orderdate) as mm,
       sum(ol.quantityOrdered * ol.priceEach) as total
from orders o join
     orderlines ol
     on o.ordernumber = ol.ordernumber
group by extract(year from o.orderdate), extract(month from o.orderdate)
order by yyyy, mm;

Базы данных отличаются друг от друга своей поддержкой функций даты и времени.Многие поддерживают более простые функции year() и month().Многие поддерживают другие механизмы для того же.

В MySQL вы можете использовать функции year() и month():

select year(o.orderdate) as yyyy,
       month(o.orderdate) as mm,
       sum(ol.quantityOrdered * ol.priceEach) as total
from orders o join
     orderlines ol
     on o.ordernumber = ol.ordernumber
group by year(o.orderdate), 
order by yyyy, mm;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...