請問SQL 2005的計數語法如何寫?

請問一下SQL語法高手, 下列問題要如何以SQL server 2005語法寫出:

計數2013/6/11 00:00 ~ 2013/6/13 12:59 之間, A1在每1小時內出現的次數

題目:

時間 名稱

2013/6/11 12:05 A1

2013/6/11 12:15 A1

2013/6/11 12:34 A1

2013/6/12 16:11 A1

2013/6/12 16:32 A1

2013/6/13 02:19 A1

2013/6/14 06:10 A2

得到答案:

時間 名稱 出現次數

2013/6/11 12:00~12:59 A1 3

2013/6/12 16:00~16:59 A1 2

2013/6/13 02:00~02:59 A1 1

已更新項目:

請問一下有類似迴圈式的寫法嗎? 不然如果要搜尋一年份的資料不就要寫8760行的程式

2 個已更新項目:

可以再請問一下魚大

如果我只搜尋 2013/6/11 12:10之後到2013/6/12 16:30之前的A1的出現次數有辦法嗎

感謝您

2 個解答

評分
  • 8 年前
    最佳解答

    slelct DATE(時間) as 日期,DATEPART(hour,時間) as 小時,名稱,count(*) as 出現次數

    from TableName

    where 名稱='A1'

    group by DATE(時間) ,DATEPART(hour,時間),名稱

    -------------------------

    得到答案:

    日期   小時 名稱 出現次數

    2013/6/11 12   A1 3

    2013/6/12 16   A1 2

    2013/6/13 02   A1 1

    如果很在意小時的範圍就將該欄位轉成文字再接字串

    CAST(DATEPART(hour,時間欄位) AS char(2))+':00~59'

    12:00~59

    ---------------------------------------

    CAST(DATEPART(hour,時間欄位) AS char(2))+':00~'+

    CAST(DATEPART(hour,時間欄位) AS char(2))+':59'

    12:00~12:59

    2013-07-02 19:15:52 補充:

    Sorry,之前是用別人的電腦,無法測試,依個人的經驗寫的

    下面的程式我有用SQL2005測試過

    2013-07-02 19:15:58 補充:

    select left(時間,10) as 日期

    ,CAST(DATEPART(hour,時間) AS char(2))+':00~'

    +CAST(DATEPART(hour,時間) AS char(2))+':59' as 小時

    ,名稱,count(*) as 出現次數

    from #tttt

    where 名稱='A1'

    group by left(時間,10),名稱

    ,CAST(DATEPART(hour,時間) AS char(2))+':00~'

    +CAST(DATEPART(hour,時間) AS char(2))+':59'

    2013-07-04 13:31:00 補充:

    再改一下

    2013-07-04 13:31:12 補充:

    select CONVERT(varchar(12), 時間, 111 )

    ,CAST(DATEPART(hour,時間) AS char(2))+':00~'

    +CAST(DATEPART(hour,時間) AS char(2))+':59'

    ,名稱,count(*) as 出現次數

    from #tttt

    where 名稱='A1'

    group by CONVERT(varchar(12), 時間, 111 )

    ,CAST(DATEPART(hour,時間) AS char(2))+':00~'

    +CAST(DATEPART(hour,時間) AS char(2))+':59'

    ,名稱

    2013-07-05 09:04:53 補充:

    where 增加時間範圍

    where 名稱='A1' and 時間 between '2013/6/11 12:10' and '2013/6/12 16:30'

  • Lv 4
    8 年前

    /*

    drop table tttt;

    create table tttt

    (

    時間 datetime,

    名稱 nvarchar(10)

    );

    insert into tttt

    values

    ('2013/6/11 12:05', 'A1')

    ,('2013/6/11 12:15' ,'A1'),

    ('2013/6/11 12:34' ,'A1'),

    ('2013/6/12 16:11' ,'A1'),

    ('2013/6/12 16:32' ,'A1'),

    ('2013/6/13 02:19' ,'A1'),

    ('2013/6/14 06:10' ,'A2') ;

    */

    select * from tttt;

    select g.時距 as 時間,g.名稱, count(g.名稱) as 出現次數 from

    (

    SELECT case when 時間<'2013/06/11 13:00:00.000' then '2013/06/11 12:00~12:59'

    when 時間<'2013/06/12 17:00:00.000' then '2013/06/12 16:00~16:59'

    when 時間<'2013/06/13 03:00:00.000' then '2013/06/13 02:00~02:59'

    when 時間<'2013/06/14 07:00:00.000' then '2013/06/14 06:00~06:59'

    end

    as 時距

    ,名稱

    from tttt ) g group by g.時距,g.名稱;

    2013-06-27 17:58:57 補充:

    原則上 依據資料應該是每個小時都要有when .... then ....

    如果72小時來說 就要有72行

    2013-07-01 11:39:08 補充:

    TO: 魚

    你的答案可能沒有經過驗證 我使用SQL SERVER 2012測試

    並不正確

    2013-07-01 11:40:13 補充:

    2013-06-13 02:19:00.0002A11

    2013-06-11 12:05:00.00012A11

    2013-06-11 12:15:00.00012A11

    2013-06-11 12:34:00.00012A11

    2013-06-12 16:11:00.00016A11

    2013-06-12 16:32:00.00016A11

    參考資料: 自己
還有問題?馬上發問,尋求解答。