3

問題: 曜日 (1、2、3、4、5、6、7)、開始日、および終了日を指定して、開始日と終了日の間に指定された曜日が出現する回数を計算します。売上がなかった日を含まない日。

環境:

テーブル「Ticket」の構造とサンプル コンテンツは次のとおりです。

i_ticket_id c_items_total      dt_create_time       dt_close_time
----------------------------------------------------------------------------
1        8.50       '10/1/2012 10:23:00'    '10/1/2012 11:05:05'
2       10.50       '10/1/2012 11:00:00'    '10/1/2012 11:45:05'
3        8.50       '10/2/2012 08:00:00'    '10/2/2012 09:25:05'
4        8.50       '10/4/2012 08:00:00'    '10/4/2012 09:25:05'
5        7.50       '10/5/2012 13:22:23'    '10/5/2012 14:33:27'
.
.
233      6.75       '10/31/2012 23:20:00'   '10/31/2012 23:55:39'

詳細

  1. 1 か月に 1 日以上のチケットがある場合とない場合があります。(つまり、その場所はその日/その日/秒閉鎖されました)

  2. 定休日は不定休です。予測可能なパターンはありません。

2 つの日付間の Get number of weekdays (Sundays, Mondays, Tuesdays) SQLに基づいて、開始日と終了日の間に特定の曜日が発生する回数を返すクエリを導き出しました。

DECLARE @dtStart DATETIME = '10/1/2013 04:00:00'
DECLARE @dtEnd DATETIME = '11/1/2013 03:59:00'
DECLARE @day_number INTEGER = 1
DECLARE @numdays INTEGER

SET @numdays = (SELECT 1 + DATEDIFF(wk, @dtStart, @dtEnd)-
CASE WHEN DATEPART(weekday, @dtStart)  @day_number THEN 1 ELSE 0 END -
CASE WHEN DATEPART(weekday, @dtEnd) <= @day_number THEN 1 ELSE 0 END)

ここで、ゼロドルの日がカウントに含まれないように、これをフィルタリングする必要があります。チケット テーブルの内容に基づいてこのフィルターを追加するために提供できるヘルプは、大歓迎です!

4

1 に答える 1

2

私の理解が正しければ、カレンダー テーブルを使用して、曜日が n で、開始と終了の間の日数を数えることができ、日付がチケットに存在し、チケットが販売されている日付であると推測できます。を持っていますsum(c_items_total) > 0

WITH cal AS 
(
  SELECT cast('2012-01-01' AS DATE) dt, datepart(weekday, '2012-01-01') dow
  UNION ALL      
  SELECT dateadd(day, 1, dt), datepart(weekday, dateadd(day, 1, dt))
  FROM cal
  WHERE dt < getdate()
)

SELECT COUNT(1)
FROM cal
WHERE dow = 5 
  AND dt BETWEEN '2012-04-01' AND '2012-12-31'
  AND EXISTS (
    SELECT 1
    FROM tickets
    WHERE cast(dt_create_time AS DATE) = dt
    GROUP BY cast(dt_create_time AS DATE)
    HAVING sum(c_items_total) > 0
    )
OPTION (MAXRECURSION 0)

SQLフィドル

于 2013-10-15T18:32:21.320 に答える