SQL 按年月排序日期

SQL sorting date by year and month

SELECT ShopOrder.OrderDate
, Book.BookID
, Book.title
, COUNT(ShopOrder.ShopOrderID) AS "Total number of order"
, SUM (Orderline.Quantity) AS "Total quantity"
, Orderline.UnitSellingPrice * Orderline.Quantity  AS "Total order value"
, book.Price * Orderline.Quantity AS "Total retail value" 
      FROM ShopOrder
      JOIN Orderline
        ON Orderline.ShopOrderID = ShopOrder.ShopOrderID
      JOIN Book
        ON Book.BookID = Orderline.BookID 
      JOIN Publisher
        ON Publisher.PublisherID = Book.PublisherID
     WHERE Publisher.name = 'Addison Wesley'
     GROUP 
        BY ShopOrder.OrderDate
, Book.BookID
, Book.title
, Orderline.UnitSellingPrice
, Orderline.Quantity, book.Price 
, Orderline.Quantity, ShopOrder.ShopOrderID
     ORDER
        BY ShopOrder.OrderDate   

Please look at the picture

我想按年按月分组查询OrderDate,这样可以把同月的数据加在一起[=13​​=]

非常感谢您的帮助

对于group,可以使用datepart函数

GROUP BY (DATEPART(yyyy, ShopOrder.OrderDate), DATEPART(mm, ShopOrder.OrderDate))

您需要从日期中提取年份和月份,并在 selectgroup by 列中使用它们。你如何做到这一点在很大程度上取决于数据库。许多支持称为 year()month() 的函数。

然后你只需要按你想要的字段进行聚合。像这样:

SELECT YEAR(so.OrderDate) as yyyy, MONTH(so.OrderDate) as mm,      
       b.BookID, b.title,
       COUNT(so.ShopOrderID) AS "Total number of order",
       SUM(ol.Quantity) AS "Total quantity",
       SUM(ol.UnitSellingPrice * ol.Quantity  AS "Total order value",
       SUM(b.Price * ol.Quantity) AS "Total retail value" 
FROM ShopOrder so JOIN
     Orderline ol
     ON ol.ShopOrderID = so.ShopOrderID JOIN
     Book b
     ON b.BookID = ol.BookID JOIN
     Publisher p
     ON p.PublisherID = b.PublisherID
WHERE p.name = 'Addison Wesley'
GROUP BY YEAR(so.OrderDate), MONTH(so.OrderDate), b.BookID, b.title
ORDER BY MIN(so.OrderDate)

请注意,使用 table 别名使查询更易于编写和阅读。

以上在 MySQL、DB2 和 SQL 服务器中有效。在 Postgres 和 Oracle 中,to_char(so.OrderDate, 'YYYY-MM').

你应该聚合

, Orderline.UnitSellingPrice * Orderline.Quantity  AS "Total order value"
, book.Price * Orderline.Quantity AS "Total retail value" 

或者您的所有 count(...) 值都等于 1。 YEAR(myDate)MONTH(myDate) for group bydatepart 函数的便捷快捷方式(在 MS SQL 服务器上)