我有一个 Northwind 查询示例,其中我使用汇总 DATEPART 作为日期年份和 DATENAME 作为月份名称。如何为每个客户按每年的时间顺序对月份进行排序?提前致谢。
我试过按DATEPART下单,但没能达到要求的效果
SELECT c.CompanyName
,DATEPART(YYYY,o.orderdate) 'Yr'
,DATENAME(MM,o.orderdate) 'Mth'
,COUNT(o.OrderID) 'Orders'
FROM Orders o
INNER JOIN Customers c
ON o.customerid = c.CustomerID
GROUP BY ROLLUP (c.CompanyName,
DATEPART(YYYY,o.orderdate),DATENAME(MM,o.orderdate))
结果是:
公司名称 | 年 | 月 | 订单 |
---|---|---|---|
Alfreds Futterkiste | 1997 | 八月 | 1 |
Alfreds Futterkiste | 1997 | 十月 | 2 |
Alfreds Futterkiste | 1997 | 空 | 3 |
Alfreds Futterkiste | 1998 | 四月 | 1 |
Alfreds Futterkiste | 1998 | 一月 | 1 |
Alfreds Futterkiste | 1998 | 三月 | 1 |
Alfreds Futterkiste | 1998 | 空 | 3 |
………… | ... | ... | ... |
Wolski Zajazd | 1996 | 十二月 | 1 |
Wolski Zajazd | 1996 | 空 | 1 |
Wolski Zajazd | 1997 | 十二月 | 1 |
Wolski Zajazd | 1997 | 七月 | 1 |
Wolski Zajazd | 1997 | 空 | 2 |
Wolski Zajazd | 1998 | 四月 | 2 |
Wolski Zajazd | 1998 | 二月 | 2 |
Wolski Zajazd | 1998 | 空 | 4 |
Wolski Zajazd | 空 | 空 | 7 |
空 | 空 | 空 | 829 |
这给出了相同的查询,但按年和月排序。它可以用作 CTE - 公用表表达式的输入。 select 可以使用 case 语句将数字月份转换为字母月份。
-- This gives the results with numeric year and month sorted
SELECT
c.CompanyName,
YEAR(o.orderdate) as YearNo,
MONTH(MM,o.orderdate) as MonthNo,
COUNT(o.OrderID) OrderTotal
FROM
Orders o
INNER JOIN
Customers c
ON
o.customerid = c.CustomerID
GROUP BY ROLLUP
(c.CompanyName, Year(o.orderdate), Month(o.orderdate))
ORDER BY
2, 3
select
CompanyName,
year(Orderdate) as Yr,
datename(month, Orderdate) as Mnth,
count(*) OrderTotal
from T
group by rollup
(CompanyName, year(Orderdate), datename(month, OrderDate))
order by
grouping(CompanyName), CompanyName,
grouping(year(Orderdate)), year(OrderDate),
grouping(datename(month, Orderdate)), min(OrderDate);
可能有一个很好的理由,即按月份编号或截断月份进行分组会更有意义。尽管如此,您仍然可以引用日期聚合(如
min(OrderDate)
以引用该日期集中的实际日期值,然后按正确的顺序排序。