我有一个包含3列的销售表
OrderId, CustomersId, OrderDateTime
如何编写T-SQL选择查询以查找结果中orderId
,2015年1月和4月2015年订单的数量?谢谢!
我应该使用union或case case或???
答案 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尝试此操作。
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)