この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 23250|答える: 11

[新号] 最も安いn部屋の選び方

[リンクをコピー]
掲載地 2018/12/05 21:32:38 | | | |
今では、room_typeとroom_infoの2つのテーブルが使えます。
IDが1~3のホテルが3軒あります。 各ホテルには3種類の客室があり、それぞれ1~9のIDが割り当てられています。
room_typeには各部屋タイプの名前、IDおよび対応するホテルIDが含まれています
room_infoに保存されているのは、各日の料金、各部屋の種類、そして残っている部屋数です。
私が質問したいトピックは以下の通りです:
予約時間の範囲と予約予定の部屋数を指定し、ホテル、部屋の種類、条件を満たす平均価格(時間、残室数)を照会し、平均価格で低い順から高い順に並べ替えてください。 結果にはホテル数、選択された部屋の組み合わせと数量、そして最も低い平均価格が含まれます。
##不要求为同一房型、でも同じホテルでなければならず、途中で部屋の種類を変えられます。
##比如、チェックイン時間は2018-11-14~2018-11-15で、予約済みの部屋数は5室です
##返回选择酒店A、11-14 ID 3の4つの部屋タイプ、ID 2の1つの部屋タイプ、11-15 ID 3の部屋タイプ3つ、ID 2の2つの部屋タイプを選択、そして最安価格は2000
##老师要求只能用sql语句、MySQLの実装はPythonやC++などを使えません
一日書かずに、似たような話題もネットで見かけなかったので、神様に助けを求めに来ました。どうやって実現すればいいのか、ありがとうございます~







先の:PHPプログラムの猿の自己申告経験共有
次に:2019年大学院入学試験の政治 徐涛と蕭秀蓉のスプリント教材
掲載地 2018/12/06 17:00:58 |
この投稿は2018年12月6日17:03にMiaolinsenによって最終編集されました。

私はmysqlではなく、mssqlでやりました:


/*
予約時間の範囲と予約予定の部屋数を指定し、ホテル、部屋の種類、条件を満たす平均価格(時間、残室数)を照会し、平均価格で低い順から高い順に並べ替えてください。 結果にはホテル数、選択された部屋の組み合わせと数量、そして最も低い平均価格が含まれます。
##不要求为同一房型、でも同じホテルでなければならず、途中で部屋の種類を変えられます。 -- 構文解析:部屋の種類を考慮せず、部屋の数だけを考慮することを意味します
##比如、チェックイン時間2018-11-14~2018-11-15を選択し、予約した部屋数は5部屋です。分析:ホテルは日付範囲内である必要があり、毎日部屋数の需要があります(特定の日に誰もいなければ基準を満たしません)
##返回选择酒店A、11-14 ID 3の4つの部屋タイプ、ID 2の1つの部屋タイプ、11-15 ID 3の部屋タイプ3つ、ID 2の2つの部屋タイプ、そして最安価格は2000 -- 分析:1日あたりの最低構成に基づいて平均価格を計算する
##老师要求只能用sql语句、mysql実装、PythonやC++などは使えません。*/


-- 入力パラメータ、日付範囲、必要な部屋数
日付@sdate宣言 = '2018-11-14';
日付@edate宣言 = '2018-11-15';
@roomnum INT = 5を宣言する;


-- 滞在日数を計算してください
インテ@daysを宣言しろ;
セット@days = 日付(日、@sdate、@edate)+1;

-- 日付範囲に合致するホテル番号、部屋数
もしEXISTS(tempdb.dbo.sysobjectsから*を選び、id = object_id(N'tempdb.. ##temp_hotel')およびtype='U')
開始
    テーブルを落とす##temp_hotel
終わり

ta.hotel_idを##temp_hotelから選択
(セレクト・リ。 [日付]、rt.hotel_id、SUM(ri.remain) room_num room_info ri 左から ri.room_id=rt.room_id に rt room_type join @sdate <= [日付] と [日付] < = RI @edate グループ。 [日付],rt.hotel_id SUM(REMAIN) >= 5) ta を持つ
Count(*) = @days を持つグループ別ta.hotel_id



-- ホテルごとに計算(1日あたりの最小客室タイプを設定する)

もしEXISTS(tempdb.dbo.sysobjectsから*を選び、id = object_id(N'tempdb.. ##temp_result')およびtype='U')
開始
    テーブルを落とす##temp_result
終わり
-- 暫定結果表 ホテル 日付 部屋の種類 ID 部屋タイプ 部屋名 部屋数 ホテル数 ホテル日次合計 日次平均ホテル価格 ホテル合計ホテル価格 ホテル総日平均料金 ホテル ホテル総日平均料金
テーブルを作成 ##temp_result(
    hotel_id INT、
    hotel_nameヴァルハル(255頁)、
    [日付] 日付、
    room_id INT、
    room_name ヴァルハル(255)、
    room_num INT、
    部屋代数 小数数、
    dsumprice dedesolmal,
    davgprice dededimal,
    小数進数、
    sumavgpric 十進数
)

DECLARE @hid INT; -- ホテルID
@infoid INTを宣言しろ; -- インフォメーションID
--カーソルが集合であることを肯定します
DECLARE のカーソルmy_cursor(##temp_hotelからhotel_idを選択);
――カーソルを開け――
オープンmy_cursor
--開始ループカーソル変数--
my_cursorから@hidへ取ってきて
@@FETCH_STATUS = 0 -- は FETCH 文で実行された最後のカーソルの状態を返します --
開始      
    -- ホテルIDに基づいて、定期的な日程の価格が決まります
    もしEXISTS(tempdb.dbo.sysobjectsから*を選び、id = object_id(N'tempdb.. ##temp_room')およびtype='U')
    開始
        ドロップテーブル##temp_room
    終わり

    -- ホテル、日付別、部屋は日付別に並べ替え レート
    info_id、[日付]、価格、残留、room_idをdbo.room_infoから##temp_roomに選択し、@sdate <= [日付]と[日付]<=@edate> 0のままで、room_id(dbo.room_typeからrt.room_idを選択してください ここで rt.hotel_id=@hid) 順位は[日付] ASC、価格 ASC
   
   
    DECLARE @thisrdate DATE = NULL; -- 日付
    INT=0@thisrnum宣言します。 -- 現在選択された部屋数
   
    DECLARE @rdate DATE = NULL; -- 日付
    @rmnum INT = 0 を宣言します。 -- 部屋の種類別部屋数
   
    -- サイクル別日付
    @my_cursor2クルサーを宣言しろ。
    セット@my_cursor2 = 選択info_idのカーソル ##temp_room 順番 [日付] ASC、価格 ASC
    オープン@my_cursor2;
    次を取って@my_cursor2から@infoid
    WHILE(@@FETCH_STATUS=0)
    開始
        --##temp_result
        @rmnum=残り、@rdate=[日付]を##temp_roomから選択info_id=@infoid
        もし(@thisrdateが零または@thisrdate!= @rdateの場合)
        開始
            印刷@rdate
            セット@thisrdate = @rdate;
            集合@thisrnum = 0;
        終わり
        -- 剤形選択室タイプ
        IF(@thisrnum <= @roomnum)
        開始
            IF (@thisrnum + @rmnum > @roomnum)
            開始
                ―― 必要な部屋の数
                セット @rmnum = @roomnum-@thisrnum;
            終わり
        終わり
        そうでなければ   
        開始
            ――その日は部屋は必要ありません
            集合@rmnum = 0;
        終わり
        
        IF(@rmnum > 0)
        開始
            -- 指定された数で結果を加算します
            ##temp_result(hotel_id、hotel_name、[日付]、room_id、room_name、room_num、ルームプライス、dsumprice、davgprice、sumpric、sumavgpric)に挿入してください。
            ##@hid、''、@thisrdate、room_id、''、@rmnum、価格、0、0、0を選択してくださいtemp_room。ここでinfo_id = @infoid
            
            -- 部屋数が計算された平均価格に達した
            集合 @thisrnum = @thisrnum + @rmnum;
            もし (@thisrnum = @roomnum)
            開始
                -- ホテル別総額、日付を考慮して計算
                更新 ##temp_result DSUMPRICE=(SELECT SUM(room_num*ルームプライス) FROM ##temp_result TR から Selected SUM(@hid HERE tr.hotel_id = と TR。[ 日付]=@thisrdate) ここで hotel_id=@hid かつ [日付]=@thisrdate
                -- ホテルごとの平均客室料金と、日付別総額を計算してください
                更新 ##temp_result DAVGPRICE=(dsumprice/@roomnum) を hotel_id=@hid と [DATE]=@thisrdate
            終わり
        終わり

        『FETCH NEXT FROM @my_cursor2 INTO @infoid』;
    終わり   
    @my_cursor2近い;  ――カーソルを消して
    @my_cursor2を解除;   --カーソルを離す

    -- ホテルごとに合計ホテル価格を計算してください
    更新 ##temp_result SET SUMPRIC=(SELECT SUM(room_num*ルーム価格)を##temp_result tr WHERE tr.hotel_id=@hid) WHERE hotel_id=@hid
    -- ホテル全体の部屋の平均日料金を計算してください
    更新 ##temp_result SET sumavgpric=(sumpric/@roomnum/@days) ここで hotel_id=@hid

    my_cursorから@hidへ次のFETCH(次のカーソル)へ移動します。デッドループはありません
終わり  
閉じるmy_cursor ― カーソルを閉じる
my_cursorを解除 - カーソルを離す


-- ホテル名と部屋タイプ名を一時テーブルに追加します
更新 ##temp_result セット hotel_name=(dbo.hotel ht からht.hotel_name選択 WHERE ht.hotel_id=##temp_result.hotel_id),
room_name=(dbo.room_type rt rt.room_name SELECT WHERE rt.room_id=##temp_result.room_id)


-- 結果表から結果を確認してください
選択 * ##temp_result




-- 一時テーブルのクリアを終了します
もしEXISTS(tempdb.dbo.sysobjectsから*を選び、id = object_id(N'tempdb.. ##temp_hotel')およびtype='U')
開始
    テーブルを落とす##temp_hotel
終わり
もしEXISTS(tempdb.dbo.sysobjectsから*を選び、id = object_id(N'tempdb.. ##temp_room')およびtype='U')
開始
    ドロップテーブル##temp_room
終わり
もしEXISTS(tempdb.dbo.sysobjectsから*を選び、id = object_id(N'tempdb.. ##temp_result')およびtype='U')
開始
    テーブルを落とす##temp_result
終わり

スコア

参加者数1MB+1 貢献する+1 倒れる 理由
管理者 + 1 + 1 他の人を助けることに熱意を持っています!

すべての評価を見る

 地主| 掲載地 2018/12/06 14:11:48 |
xzxmustwin 2018-12-6 11:58 に投稿
正直なところ、この表の構成は少し理不尽です

emmmmデータベースの先生が出す宿題の問題は確かに理不尽かもしれませんし、私があまりよく覚えていなければ気づきませんでした...
しかし、重要なのは問題解決のアイデアです。友人たちに何か提案があれば聞きたいです。
 地主| 掲載地 2018/12/06 14:09:20 |
LZZSFが2018年12月6日 09:07に投稿しました
MySQLは古く、クライアントもありません。SQL Serverのスクリプトをください

すみません、まだSQL Severは使っていません。多分授業だけなので、先生がmySQLを使うように言いました。 もし友人の皆さんがアイデアを共有してくれるなら、本当にありがとうございます。
掲載地 2018/12/05 21:57:13 |
QQグループに行って10元の報酬を提示し、誰かが答えてくれるか聞いてみます
掲載地 2018/12/06 7:56:39 |
ヘルプ
掲載地 2018/12/06 9:07:08 |
MySQLは古く、クライアントもありません。SQL Serverのスクリプトをください

スコア

参加者数1MB+1 貢献する+1 倒れる 理由
管理者 + 1 + 1 熱意があります!

すべての評価を見る

掲載地 2018/12/06 11:24:25 |
LZZSFが2018年12月6日 09:07に投稿しました
MySQLは古く、クライアントもありません。SQL Serverのスクリプトをください

このアイデアについて話し合い、大家さんに推薦状として使ってもらうことが推奨されており、それも可能であるはずです
掲載地 2018/12/06 11:58:37 |
正直なところ、この表の構成は少し理不尽です

スコア

参加者数1MB+1 貢献する+1 倒れる 理由
管理者 + 1 + 1 熱意があります!

すべての評価を見る

 地主| 掲載地 2018/12/06 14:07:29 |
2018年12月5日 21:57に公開
QQグループに行って10元の報酬を提示し、誰かが答えてくれるか聞いてみます

ありがとうございます。もし答えてくれる方がいれば、赤い封筒を送ります:)
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com