1

30 分間隔で顧客の数を合計し、各顧客が費やした金額を合計しながら、30 分間隔で顧客レコードをグループ化するクエリを取得しようとしています。

私はこれが初めてで、真っ向から取り組もうとしています。

Microsoft SQL 2005 を使用しています。

これは私のメインテーブルがどのように見えるかの例です:

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

間隔は、特定の日付の 1 時間ごとに から の間0-29である必要があります。30-59

日付範囲でレコードを簡単に選択する方法を理解しました。しかし、グループ化機能に問題があります。

4

1 に答える 1

1
    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

実際の例はhttp://sqlfiddle.com/#!3/794ae/12にあります。

計算さtime_chunk_hashれたは、出力の順序付けとグループ化に使用され、次のようになります。

 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

実際の例は http://sqlfiddle.com/#!3/794ae/11にあります。

于 2013-07-29T01:58:55.403 に答える