2011-11-28 215 views
1

我試圖查詢我的SQL數據庫以獲取每個客戶端在特定日期範圍內發出的訂單數量。SQL計數日期範圍

我的訂單列表如下

CustomerName  ClientID  DateOrdered 
Customer No.2   10   2011-11-25 
Customer No.3   11   2011-10-15 
Customer No.3   11   2011-11-25 

,我希望能找出多少訂單都已經由一個特定的客戶端,例如2011-11-1和2011-11之間-30,這將導致:

CustomerName  ClientID  Number 
Customer No.3   11    1 
Customer No.2   10    1 

到目前爲止,我已經成功地得到這個

SELECT CustomerName, ClientID, COUNT(*) AS Number  
FROM Orders t  
GROUP BY CustomerName, ClientID  
HAVING COUNT(*) =  
(SELECT MAX(Number)   
FROM   
(SELECT CustomerName, ClientID, COUNT(*) AS Number    
FROM Orders    
GROUP BY CustomerName, ClientID) x  
WHERE CustomerName = t.CustomerName) 

其中G艾夫斯我每一個訂單的客戶已做過

CustomerName  ClientID  Number 
Customer No.3   11    2 
Customer No.2   10    1 

我要對正確的方式來解決這個問題還是有,我已經完全忽略了一個更簡單的辦法!

+0

用戶頭像:Customer ID和CustomerName爲什麼在訂單表中?要有任何其他客戶信息,您將不得不加入客戶賬單。如果您錯誤輸入了客戶名稱並更正了它,則需要修改訂單表以在此處進行更改。所以只有外鍵客戶Id纔會更準確...... – luso

+0

它實際上不應該在那裏!感謝提醒我把它拿出:) – kiwijus

回答

6
select CustomerName, ClientID, count(*) 
from 
(
    select CustomerName, ClientID 
    from Orders 
    where datediff(mm, DateOrdered, getdate()) <= 1 
)a 
group by CustomerName, ClientID 

這樣做是利用子查詢按給定月份中的日期過濾行(這似乎是你正在尋找的)。然後按CustomerNameClientID進行分組,並獲得他們的訂單總和。

+0

@kiwijus樂於幫助!請點擊此帖的複選標記,將此答案標記爲「已接受」。 :) – 2011-11-28 14:26:36

+0

['sum'](http://msdn.microsoft.com/en-us/library/ms187810%28v=SQL.90%29.aspx)...?它真的在SQL Server中工作嗎? 'datediff(mm,DateOrdered,getdate())' - 如果可用,它會使用索引嗎? –

+0

@Shark,爲什麼使用子查詢? –

5

應該很好地工作:

select CustomerName, ClientID, count(*) as Number 
from Orders 
where DateOrdered between '20111101' and '20111130' 
group by CustomerName, ClientID 
+0

@MichaelPowaga,爲什麼使用子查詢? –

+0

@MarkBannister,這不是必要的,但它在執行計劃中沒有改變(最後在我的情況下)。 –

+0

@MichaelPowaga,爲什麼要使用它? –

1
select ClientID, max(CustomerName), count(*) 
from Orders 
where DateOrdered between '2011-11-01' and '2011-11-30' 
group by ClientID 

根據數據庫中,DateOrdered選擇的語法可能需要改變。

+0

不要忘記添加'start_date 00:00:00'和'end_date 23:59:59',如果你的變量是(Ymd) – luso

+0

這個問題暗示只有日期 - 沒有時間 - 否則我會把... ...' DateOrdered> ='2011-11-01'和DateOrdered <'2011-12-01''。訂單可能發生在23:59:59.1,這會被'between'語法遺漏。 –

+1

對於日期範圍,通常使用DateOrdered> ='2011-11-01'和DateOrdered <'2011-12-01''來更好地服務。通過使結束日期獨佔(使用'<'),您不需要關心日期字段是否包含時間。 – MatBailie

0
SELECT 
    c.CustomerName, 
    count(o.OrderID) as Orders 
FROM 
    orders o 
JOIN clients c ON o.ClientID = c.ClientID 
WHERE 
    o.DateOrdered BETWEEN '2011-11-01' AND '2011-11-20' 
GROUP BY c.ClientID ; 
+0

我不會在這裏使用'''... – MatBailie

+0

@Dems,很好的地方:) – Prisoner