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
我想按年按月分组查询OrderDate,这样可以把同月的数据加在一起[=13=]
非常感谢您的帮助
对于group,可以使用datepart函数
GROUP BY (DATEPART(yyyy, ShopOrder.OrderDate), DATEPART(mm, ShopOrder.OrderDate))
您需要从日期中提取年份和月份,并在 select
和 group 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 by
是 datepart
函数的便捷快捷方式(在 MS SQL 服务器上)
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
我想按年按月分组查询OrderDate,这样可以把同月的数据加在一起[=13=]
非常感谢您的帮助
对于group,可以使用datepart函数
GROUP BY (DATEPART(yyyy, ShopOrder.OrderDate), DATEPART(mm, ShopOrder.OrderDate))
您需要从日期中提取年份和月份,并在 select
和 group 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 by
是 datepart
函数的便捷快捷方式(在 MS SQL 服务器上)