0

次の 2 つのテーブルがあるとします。

tblHotels:
id INT
hotel_name VARCHAR
booking_open_date DATETIME
booking_close_date DATETIME

tblRegistrantHotelDates:
id INT
registrant_id INT
hotel_id INT
booking_date DATETIME

...ここで、tblRegistrantHotelDatesの各エントリは、ホテルに 1 泊する登録者を表します (したがって、2 泊する登録者は、同じホテル ID と異なる booking_date を持つテーブルに 2 つの行を持つことになります)...

この形式で一連の結果を取得するにはどうすればよいですか。

registrant_id,hotel_id,3rd March,4th March,5th March
42,6,1,0,1
57,6,1,1,0

... *tblHotels.booking_open_date* から *tblHotels.booking_close_date* へのループによって列名が生成されます (列名の正確な日付形式については気にしません)。各日付の 1/0列は、登録者がその日にそのホテルに滞在するかどうかを示していますか?

注: すべてのホテルの予約開始日と終了日が同じというわけではありませんが、常に重複します。そのため、生成された列名は、最も早いホテルの開業日から最も遅いホテルの閉店日までである必要があります。

これはSQLでも可能ですか?

編集 - これは私が持っているものです。日付を列名として入れず、明示的にクエリした数の日付に対してのみ機能し、ひどく不格好で遅い混乱です。同様の解決策を探している他の人へ:これはそうしない方法です。うまくいけば、何をすべきかを知っている人がすぐに現れるでしょう:

SELECT
reg.first_name,
reg.last_name,

MIN(h.booking_open_date) AS day_1,
(
    SELECT 1 FROM tblRegistrantHotelDates rh
    WHERE rh.hotel_id = h.id
    AND rh.registrant_id = reg.id
    AND rh.hotel_date = MIN(h.booking_open_date)
) AS day_1_booked,

CASE WHEN DATE_ADD(MIN(h.booking_open_date),INTERVAL 1 DAY) < MAX(h.booking_close_date) THEN
    DATE_ADD(MIN(h.booking_open_date),INTERVAL 1 DAY)
END AS day_2,
(
    SELECT 1 FROM tblRegistrantHotelDates rh
    WHERE rh.hotel_id = h.id
    AND rh.registrant_id = reg.id
    AND rh.hotel_date = DATE_ADD(MIN(h.booking_open_date),INTERVAL 1 DAY)
) AS day_2_booked,

CASE WHEN DATE_ADD(MIN(h.booking_open_date),INTERVAL 2 DAY) < MAX(h.booking_close_date) THEN
    DATE_ADD(MIN(h.booking_open_date),INTERVAL 2 DAY)
END AS day_3,
(
    SELECT 1 FROM tblRegistrantHotelDates rh
    WHERE rh.hotel_id = h.id
    AND rh.registrant_id = reg.id
    AND rh.hotel_date = DATE_ADD(MIN(h.booking_open_date),INTERVAL 2 DAY)
) AS day_3_booked,

## etc etc...

MAX(h.booking_close_date) AS day4,
(
    SELECT 1 FROM tblRegistrantHotelDates rh
    WHERE rh.hotel_id = h.id
    AND rh.registrant_id = reg.id
    AND rh.hotel_date = MAX(h.booking_close_date)
) AS day_4_booked

FROM tblRegistrants reg
LEFT JOIN tblRegistrantHotelDates hd ON hd.registrant_id = reg.id
LEFT JOIN tblHotels h ON hd.hotel_id = h.id
GROUP BY reg.id
4

0 に答える 0