web-dev-qa-db-ja.com

列の値に基づいて行を動的に生成する方法

私はデータウェアハウスに統合するためにいくつかのデータを非正規化するクエリを作成しようとしています。具体的には、いくつかのタイムスロットの生成についてです。

私のソースシステムには、開始時刻と終了時刻を含むテーブルと、15分間隔で使用可能な予約スロットの数を指定する列があります。

例:

    Location | Start Time | End Time | Appointment Slots
    A        | 9:00 am    | 5:00 pm  | 2
    B        | 9:00 am    | 5:00 pm  | 1

CTEを使用して、15分のブロックのリストを生成できました。ただし、各15分のスロットは、場所Aに2つのスロットが利用可能で、場所Bに1つのスロットが利用可能であることを示しています。場所Aで15分あたり2行、15分あたり1行を生成できるようにしたいと思います。ロケーションBの場合.

2
njkroes

これは、「Number」テーブルが非常に便利になる例です。この概念に精通していない場合は、Adam Machanicの次のブログ投稿をご覧ください。 数値表が必要です

数値テーブルは、Appointment Slots列(この場合)に結合して、各行AppointmentSlotsの回数を複製するために使用されます。

-- A simple recreation of your CTE data...
CREATE  TABLE #AppointmentPeriods
(
    AppointmentLocation CHAR(1),
    AppointmentStartTime TIME,
    AppointmentEndTime TIME,
    AppointmentSlotsAvailable SMALLINT
)

INSERT  INTO #AppointmentPeriods VALUES
    ('A', '09:00', '09:15', 2),
    ('A', '09:15', '09:30', 2),
    ('A', '09:30', '09:45', 2),
    -- ....
    ('A', '16:30', '16:45', 2),
    ('A', '16:45', '17:00', 2),
    ('B', '09:00', '09:15', 1),
    ('B', '09:15', '09:30', 1),
    ('B', '09:30', '09:45', 1),
    -- ....
    ('B', '16:30', '16:45', 1),
    ('B', '16:45', '17:00', 1)


-- Numbers table
CREATE  TABLE #Numbers (NumberValue SMALLINT)

INSERT  INTO #Numbers
-- TOP value should be changed so it is greater than the
-- maximum number of potential appointment slots any location can have
SELECT  TOP 20
        ROW_NUMBER() OVER (ORDER BY object_id)
FROM    sys.objects


SELECT  #AppointmentPeriods.*, NumberValue AS AppointmentSlotNumber
FROM    #AppointmentPeriods
        INNER JOIN #Numbers
            ON AppointmentSlotsAvailable >= NumberValue

クエリ出力:

Location | StartTime | EndTime | AppointmentSlots | SlotNumber
A        | 09:00     | 09:15   | 2                | 1
A        | 09:00     | 09:15   | 2                | 2
A        | 09:15     | 09:30   | 2                | 1
A        | 09:15     | 09:30   | 2                | 2
B        | 16:30     | 16:45   | 1                | 1
B        | 16:45     | 17:00   | 1                | 1

PS:数値テーブルを生成するには多くの方法があります: SO:数値テーブルを作成してデータを追加する最良の方法は何ですか?

5
garthmillar