在SQL Server中按月比较订单

时间:2015-10-10 17:09:09

标签: sql sql-server

我有一个包含3列的销售表

OrderId, CustomersId, OrderDateTime

如何编写T-SQL选择查询以查找结果中orderId,2015年1月和4月2015年订单的数量?谢谢!

我应该使用union或case case或???

3 个答案:

答案 0 :(得分:1)

如果我理解正确的话:

select month(OrderDateTime),count(OrderId) from your data group by month(OrderDateTime)

如果您的意思是:

  

orderId作为计数?

答案 1 :(得分:1)

您要找的是datepart function

如果您想要2015年1月,4月的订单,您可以按如下方式编写查询:

SELECT 
    count(t.OrderId) as Orders, 
    DatePart(month, t.OrderDateTime) as Month
FROM 
    SalesTable t
WHERE 
    datepart(year, t.OrderDateTime) = 2015 
    AND (datepart(month, t.OrderDateTime) = 1 
    OR datepart(month, t.OrderDateTime) = 4)
GROUP BY
    datepart(month, t.OrderDateTime)

有关工作示例,请参阅此fiddle

修改

如果您想使用完整的月份名称而不是数字,则可以从here应用其中一种解决方案。该查询将如下所示:

SELECT count(t.OrderId) as Orders, DateName(month , DateAdd( month , DatePart(month, t.OrderDateTime), -1 ))
FROM SalesTable t
WHERE datepart(year, t.OrderDateTime) = 2015 and 
      (datepart(month, t.OrderDateTime) = 1 or datepart(month, t.OrderDateTime) = 4)
group by datepart(month,t.OrderDateTime)

<强> EDIT2: 根据您的评论,January2015Orders和April2015Orders列是强制性的。在这种情况下,您可以使用此解决方案:

SELECT count(t.OrderId) as Orders, 
       DatePart(month, t.OrderDateTime) as January2015Orders,
       null as April2015Orders
FROM SalesTable t
WHERE datepart(year, t.OrderDateTime) = 2015 and 
      datepart(month, t.OrderDateTime) = 1
group by datepart(month,t.OrderDateTime)

UNION

SELECT count(t.OrderId) as Orders, 
       null as January2015Orders,
       DatePart(month, t.OrderDateTime) as April2015Orders
FROM SalesTable t
WHERE datepart(year, t.OrderDateTime) = 2015 and 
      datepart(month, t.OrderDateTime) = 4
group by datepart(month,t.OrderDateTime)

第一个查询选择January2015Orders,其值和April为null。接下来是第二个查询,它选择January作为null,选择April2015Orders及其值。

不漂亮,但它(希望)呈现正确的结果。 Here's the fiddle来玩

答案 2 :(得分:0)

您可以在Sql Server中使用DATENAME尝试此操作。

像,Fiddle Demo Here

 SELECT 
    Cast(DATENAME(MONTH, t.OrderDateTime) as Varchar(20))+
    cast(DATENAME(YEAR, t.OrderDateTime) as varchar(4)) as YearMonth,
    count(t.OrderId) as Orders
    FROM SalesTable t
    group by DATENAME(MONTH,t.OrderDateTime),DATENAME(YEAR,t.OrderDateTime)