Sql rollup 按日期名排序

问题描述 投票:0回答:2

我有一个 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
sql sorting rollup
2个回答
0
投票

这给出了相同的查询,但按年和月排序。它可以用作 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

0
投票
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)
以引用该日期集中的实际日期值,然后按正确的顺序排序。

https://dbfiddle.uk/vsNEr83n

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.