2012-05-04 70 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