2013-07-29 231 views
1

我试图获得一个查询,以30分钟的时间间隔对客户记录进行分组,同时在30分钟的时间间隔内累计客户数量以及每位客户花费的总金额。按30分钟的时间间隔分组查询

我是新来的,我正试着把它带上。

我使用的是Microsoft SQL 2005

这里是什么我的主表看起来像一个例子:

Cust_ID (Prime key), Date_time (Time of order), Price, and Sales_Tax 

的时间间隔应该是0-29和每个小时30-59之间的具体日期。

我已经想出了如何简单地按日期范围选择记录。但我在分组功能方面遇到问题。

回答

0
SELECT SUM(price)   AS price_sum, 
     SUM(tax)     AS tax_sum, 
     COUNT(DISTINCT cust_id) AS cust_count, 
     CONVERT(varchar(13), time_of_order, 120) 
     + CASE 
      WHEN DATEPART(minute, time_of_order) < 30 THEN 'A' 
      ELSE 'B' 
      END   AS time_chunk_hash 
    FROM Sales 
     GROUP BY CONVERT(varchar(13), time_of_order, 120) 
        + CASE 
         WHEN DATEPART(minute, time_of_order) < 30 THEN 'A' 
         ELSE 'B' 
         END 
     ORDER BY CONVERT(varchar(13), time_of_order, 120) 
        + CASE 
         WHEN DATEPART(minute, time_of_order) < 30 THEN 'A' 
         ELSE 'B' 
        END 

工作示例是在:time_chunk_hash被用于排序和组的输出,并且将类似于http://sqlfiddle.com/#!3/794ae/12

的计算:

2013-07-28 15A 
2013-07-29 15B 

其将指示,例如,将7月28日下午3点后的第一个半小时,然后是下半场。

这里呈现相同的查询更可读的方式

SELECT SUM(price)     AS price_sum, 
     SUM(tax)     AS tax_sum, 
     COUNT(DISTINCT cust_id)  AS cust_cnt, 
     time_chunk_hash 
    FROM 
    (
     SELECT price, 
      tax, 
      cust_id, 
      CONVERT(varchar(13), time_of_order, 120) 
       + CASE 
        WHEN DATEPART(minute, time_of_order) < 30 THEN 'A' 
        ELSE 'B' 
       END   AS time_chunk_hash 
     FROM Sales 
    ) HASHED 
    GROUP BY time_chunk_hash 
    ORDER BY time_chunk_hash 

的工作例子是:

+0

我得到一个错误,指出,“MINUTE”是无法识别的内置函数名称,我需要创建一个分钟列来纠正这个错误?此外,我在上面的帖子中的订单时间不是表格的公园。我只需要用Date_Time替换它是否正确? – user2628624

+0

@ user2628624不需要。将'DatePart(minute,time_of_order)'替换为'MINUTE(time_of_order)''。对于那个很抱歉。文档位于:http://msdn.microsoft.com/en-us/library/ms174420.aspx。我已经更新了我的答案以反映修复。 – Curt

+0

只是为了带领你走下花园的道路,我已经为你添加了一个SQLFiddle示例:http://sqlfiddle.com/#!3/794ae/3 – Curt