2016-12-22 83 views
0

我有結果這樣分組結果在SQL

TimeDiffMin | OrdersCount 
10   | 2 
12   | 5 
09   | 6 
20   | 15 
27   | 11 

我想下面

TimeDiffMin | OrdersCount 
05   | 0 
10   | 8 
15   | 5 
20   | 15 
25   | 0 
30   | 11 

所以你可以看到,我想每5分鐘和顯示的分組這5分鐘內的總訂單數。例如。 0-5分0個訂單,5-10分鐘8個訂單

任何幫助,將不勝感激。

當前查詢:

SELECT TimeDifferenceInMinutes, count(OrderId) NumberOfOrders FROM (
SELECT AO.OrderID, AO.OrderDate, AON.CreatedDate AS CancelledDate,  DATEDIFF(minute, AO.OrderDate, AON.CreatedDate) AS TimeDifferenceInMinutes 
FROM 
(SELECT OrderID, OrderDate FROM AC_Orders) AO 
JOIN 
(SELECT OrderID, CreatedDate FROM AC_OrderNotes WHERE Comment LIKE '%has been cancelled.') AON 
ON AO.OrderID = AON.OrderID 
WHERE DATEDIFF(minute, AO.OrderDate, AON.CreatedDate) <= 100 AND AO.OrderDate >= '2016-12-01' 
) AS Temp1 
GROUP BY TimeDifferenceInMinutes 
+0

請選擇mysql'和'SQL-server' – Blag

回答

1

可以使用派生表,首先建立你的時間差,窗戶,然後從連接來總結這樣做落在該窗口內的所有Orders

declare @t table(TimeDiffMin int 
       ,OrdersCount int 
       ); 
insert into @t values 
(10, 2) 
,(12, 5) 
,(09, 6) 
,(20,15) 
,(27,11); 

declare @Increment int = 5; -- Set your desired time windows here. 

with n(n) 
as 
( -- Select 10 rows to start with: 
    select n from(values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) as n(n) 
),n2 as 
( -- CROSS APPLY these 10 rows to get 10*10=100 rows we can use to generate incrementing ROW_NUMBERs. Use more CROSS APPLYs to get more rows: 
    select (row_number() over (order by (select 1))-1) * @Increment as StartMin 
     ,(row_number() over (order by (select 1))) * @Increment as EndMin 
    from n    -- 10 rows 
    cross apply n n2 -- 100 rows 
    --cross apply n n3 -- 1000 rows 
    --cross apply n n4 -- 10000 rows 
) 
select m.EndMin as TimeDiffMin 
     ,isnull(sum(t.OrdersCount),0) as OrdersCount 
from n2 as m 
    left join @t t 
    on(t.TimeDiffMin >= m.StartMin 
     and t.TimeDiffMin < m.EndMin 
     ) 
where m.EndMin <= 30 -- Filter as required 
group by m.EndMin 
order by m.EndMin 

查詢結果:

TimeDiffMin OrdersCount 
5   0 
10   6 
15   7 
20   0 
25   15 
30   11 
+0

我還想着之間'你的標籤這但我認爲必須有一個更簡單的解決方案.. –

+0

@ patel.milanb通過一切手段與我們分享這個更簡單的解決方案,但沒有首先生成值的表加入我是瞭解更簡單的問題解決方案。請記住,代碼長度與代碼複雜度無關。 – iamdave

2

現在,如果你是開放的TVF。

我使用此UDF來創建動態日期/時間範圍。您提供的範圍和增量

Declare @YourTable table (TimeDiffMin int,OrdersCount int) 
Insert Into @YourTable values 
(10, 2), 
(12, 5), 
(09, 6), 
(20,15), 
(27,11) 


Select TimeDiffMin = cast(R2 as int) 
     ,OrdersCount = isnull(sum(OrdersCount),0) 
From (Select R1=RetVal,R2=RetVal+5 From [dbo].[udf-Range-Number](0,25,5)) A 
Left Join (
      -- Your Complicated Query 
      Select * From @YourTable 
     ) B on TimeDiffMin >= R1 and TimeDiffMin<R2 
Group By R1,R2 
Order By 1 

返回

TimeDiffMin OrdersCount 
5   0 
10   6 
15   7 
20   0 
25   15 
30   11 

的UDF如果有興趣

CREATE FUNCTION [dbo].[udf-Range-Number] (@R1 money,@R2 money,@Incr money) 
Returns Table 
Return (
    with cte0(M) As (Select cast((@[email protected])/@Incr as int)), 
     cte1(N) As (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)), 
     cte2(N) As (Select Top (Select M from cte0) Row_Number() over (Order By (Select NULL)) From cte1 a,cte1 b,cte1 c,cte1 d,cte1 e,cte1 f,cte1 g,cte1 h) 

    Select RetSeq=1,[email protected] Union All Select N+1,(N*@Incr)[email protected] 
    From cte2 
) 
-- Max 100 million observations 
-- Select * from [dbo].[udf-Range-Number](0,4,0.25)