2012-11-21 35 views
0

在我的應用我只是想獲得number of sales in a day by diiferent time interval選擇值

----------------------------------------------------- 
Interval      | Count 
----------------------------------------------------- 
00:30 to 0:130    | 3 
01:30 to 10:30    | 4 
02:30 to 03:30    | 5 
.. 
.. 
12:30 to 00:30    | 10 
----------------------------------------------------- 

我試着像下面

select '00:30 to 01:30' as intrval , COUNT(*) AS 'count' from Pharmacy.tblSalesHdr SH 
where CAST(SH.created_Date AS TIME) BETWEEN '00:30' AND '00:30' 

UNION ALL 

select '01:30 to 02:30' as intrval , COUNT(*) AS 'count' from Pharmacy.tblSalesHdr SH 
where CAST(SH.created_Date AS TIME) BETWEEN '01:30' AND '02:30' 

UNION ALL 

select '02:30 to 03:30' as intrval , COUNT(*) AS 'count' from Pharmacy.tblSalesHdr SH 
where CAST(SH.created_Date AS TIME) BETWEEN '02:30' AND '03:30' 

and so on... 

查詢我只是想知道是否有任何better and optimized method那裏來實現這一點。如果有人知道可以分享。

回答

3

你可以這樣做:創建一個臨時表,定義你想要的時間間隔,然後將它加入你的銷售表。你甚至可以爲任務創建一個永久表。

CREATE TABLE #Intervals (INTERVAL VARCHAR(20), FromTime TIME, ToTime TIME) 
    INSERT INTO #Intervals (INTERVAL, FromTime, ToTime) VALUES ('00:30 to 01:30', '00:30:00', '01:30:00') 
    INSERT INTO #Intervals (INTERVAL, FromTime, ToTime) VALUES ('01:30 to 02:30', '01:30:00', '02:30:00') 
    INSERT INTO #Intervals (INTERVAL, FromTime, ToTime) VALUES ('02:30 to 03:30', '02:30:00', '03:30:00') 
    INSERT INTO #Intervals (INTERVAL, FromTime, ToTime) VALUES ('03:30 to 04:30', '03:30:00', '04:30:00') 
    INSERT INTO #Intervals (INTERVAL, FromTime, ToTime) VALUES ('04:30 to 05:30', '04:30:00', '05:30:00') 
    INSERT INTO #Intervals (INTERVAL, FromTime, ToTime) VALUES ('05:30 to 06:30', '05:30:00', '06:30:00') 
    INSERT INTO #Intervals (INTERVAL, FromTime, ToTime) VALUES ('06:30 to 07:30', '06:30:00', '07:30:00') 
    INSERT INTO #Intervals (INTERVAL, FromTime, ToTime) VALUES ('07:30 to 08:30', '07:30:00', '08:30:00') 
    INSERT INTO #Intervals (INTERVAL, FromTime, ToTime) VALUES ('08:30 to 09:30', '08:30:00', '09:30:00') 
    INSERT INTO #Intervals (INTERVAL, FromTime, ToTime) VALUES ('09:30 to 10:30', '09:30:00', '10:30:00') 
    -- etc... 

    SELECT I.Interval, SUM(case when SH.created_Date IS NULL THEN 0 ELSE 1 END) 
    FROM #Intervals I 
    LEFT JOIN Pharmacy.tblSalesHdr SH 
     ON CAST(SH.created_Date AS TIME) >= I.FromTime 
     AND CAST(SH.created_Date AS TIME) < I.ToTime 
    GROUP BY I.Interval 

    DROP TABLE #Intervals