sql >> データベース >  >> RDS >> Sqlserver

都市xとyの間、およびその逆の合計移動時間を計算する方法

    質問

    あなたは航空会社で働いており、都市間のパイロットの移動時間のデータセットを受け取りました。逆数を決定し、都市間の合計移動時間を見つける必要があります。つまり、パイロットの都市「1」から「2」および都市「2」から「1」への移動を1と見なしてから、合計移動時間を計算する必要があります。

    期待される出力を実現するSQLクエリを記述します。

    回答

    まず、テストデータを作成しましょう。

    --create test data
    USE demo;
    
    CREATE TABLE dbo.travel_detail (
        id int identity(1,1),
        from_city varchar(100),
        to_city varchar(100),
        travel_time_hours smallint
    )
    GO
    
    INSERT INTO dbo.travel_detail values
        ('Oslo','Helsinki',125),
        ('Helsinki','Oslo',110),
        ('Stockholm','Oslo',132),
        ('Oslo','Stockholm',180),
        ('Copenhagen','Helsinki',148),
        ('Helsinki','Copenhagen',84),
        ('Stockholm','Copenhagen',116),
        ('Helsinki','Stockholm',124)
    GO
    
    SELECT * FROM dbo.travel_detail
    
    --clean up
    --USE demo;
    --DROP TABLE dbo.travel_detail
    
    

    目的の結果を得るには、ある順序に基づいて行内の都市名を入れ替える必要があります。つまり、from_cityとto_cityの名前を昇順または降順で行に並べ替えてから、最初の都市をcity_1のままにしておくことができます。 もう1つはcity_2です。これを行うには、<未満を使用できます または>より大きい from_cityの演算子 およびto_city

    このようにして、travel_time_hoursを集計できるようになります。 city_1をグループ化する およびcity_2

    --solution
    USE demo;
    
    select 
    city_1,
    city_2,
    total_travel_hours = sum(travel_time_hours)
    from (
        select 
        city_1 = case when from_city < to_city then from_city else to_city end,
        city_2 = case when from_city > to_city then from_city else to_city end,
        travel_time_hours
        from dbo.travel_detail
    )x
    group by city_1, city_2
    order by city_1, city_2
    
    

    これが私が思いついた解決策です。他の方法で出力を達成した場合は、コメントで知らせてください。

    サインアップして、これらの面接の質問を受信トレイで直接受け取ります。


    1. WSJDBCConnectionは、タイプOraclejdbcConnectionのオブジェクトをラップしません

    2. ループせずにphpとmysqlを使用してスコアテーブルから誰かの「ランク」を取得する最善の方法

    3. ハロウィーンの問題–パート1

    4. 常にnvarchar(MAX)を使用することに不利な点はありますか?