2012-05-04 45 views
0

这是我的第一篇文章在这里,所以如果我一直误认为是我的岗位和我的英语说对不起:)按订单日期和产品的SQL Server 2008鲜明

我已经做研究的谷歌,可惜到现在为止我不能解决这个问题。

这是我的问题,通过日期在每个产品上显示总订单,我想不同的产品

这里是我的查询样本

SELECT Orders.OrderDate 
      ,SUM(OrderDetails.OrderDetailQuantity) AS totalOrdered 
      ,Products.ProductId 
FROM Orders 
INNER JOIN OrderDetails ON Orders.OrderId = OrderDetails.OrderId 
INNER JOIN Products ON OrderDetails.ProductId = Products.ProductId 
GROUP BY Orders.OrderId 
      ,Orders.OrderDate 
      ,Products.ProductId 
HAVING (CONVERT(VARCHAR, Orders.OrderDate, 23) BETWEEN @from AND @to) 

现在,我根据需要不同的产品在OrderDate之间,我知道这里最大的问题是DATE,但我不知道如何区分这个查询的日期。

请帮帮我。谢谢。

P.S:如果你想在LINQ表达式来解决这一点,将是非常接受:)

回答

1

样本数据和预期的结果会有所帮助。当你说“不同”时,我假设你指的是群组。请注意,在WHERE子句中,如果确保@from参数的时间部分设置正确(包括每一整天),则不需要投入Order.OrderDate。它从来不是一个好主意,可以将投射操作应用到比较的左侧。

SELECT --cast(Orders.OrderDate as date), 
     Products.ProductId 
     SUM(OrderDetails.OrderDetailQuantity) AS totalOrdered, 
FROM Orders 
INNER JOIN OrderDetails ON Orders.OrderId = OrderDetails.OrderId 
INNER JOIN Products ON OrderDetails.ProductId = Products.ProductId 
where Orders.OrderDate between cast(@from as date) AND cast(@to as date) 
GROUP 
BY  --cast(Orders.OrderDate as date), 
     Products.ProductId 


-- to illustrate: 
declare @From datetime = '1/1/2000 10:30:22', 
     @To datetime = '1/3/2000 9:11:31' 

declare @orders table (i int, dt datetime) 
insert into @orders 
    values(1, '1/1/2000 8:00'),(2, '1/2/2000 10:00'), (3, '1/4/2000 3:00') 


-- only returns i=2 
select * 
from @orders 
where dt between @From and @To 

-- returns i=1 & i=2 
select * 
from @orders 
where dt between cast(@From as date) and cast(@To as date) 
+0

肯定是正确的,但我不想显示列订购日期,所以我可以很容易地通过产品组..感谢您的回复,先生:) – spajce

+0

应该最终的结果是什么样子?只有两列ProductId和totalOrdered? –

+0

是的,先生,多数民众赞成我想要显示..但我们知道,我们需要由OrderDate组,所以我们可以过滤日期.. – spajce