2016-04-07 113 views
1

SQLの質問:クロス列「一致」を持つ行全体のSQL合計?

私が持っている3列のテーブル:From_City、To_City、Trip_Count と4行:私は2を持って新しいテーブルに都市間の旅行を合計する

+-----------+---------+------------+ 
| From_City | To_City | Trip_Count | 
+-----------+---------+------------+ 
| Berlin | London |   2 | 
| London | Berlin |   3 | 
| Sydney | Tokyo |   4 | 
| Tokyo  | Sydney |   6 | 
+-----------+---------+------------+ 

行のみ:

+--------+------------+------------+ 
| City | Other_City | Trip_Count | 
+--------+------------+------------+ 
| Berlin | London  |   5 | 
| Sydney | Tokyo  |   10 | 
+--------+------------+------------+ 

これをSQL(できればSQL Server)でどのように実現するかわかりませんでした。助言がありますか?ありがとう!

注:2都市間の注文は関係ありません。ベルリン - ロンドンまたはロンドン - ベルリンのいずれかが問題ありません。

答えて

2

これを試してみてください:

SELECT CASE 
      WHEN From_City < To_City THEN From_City 
      ELSE To_City 
     END AS City, 
     CASE 
      WHEN From_City >= To_City THEN From_City 
      ELSE To_City 
     END AS Other_City, 
     SUM(Trip_Count) AS Trip_Count 
FROM mytable 
GROUP BY CASE WHEN From_City < To_City THEN From_City ELSE To_City END, 
     CASE WHEN From_City >= To_City THEN From_City ELSE To_City END 
0

UPDATEを:FLICKERが指摘したように、これは、SQL Serverでは、SQL ServerがLEAST、GREATEST、またはSQLiteのMIN/MAXのような同様の機能を提供しないため、SQL Serverでは機能しません。ごめんなさい。


あなたはGREATESTLEASTおよび他の2つの最初の都市を取得する:

create table full_trips as 
(
    select 
    least(from_city, to_city) as city, 
    greatest(from_city, to_city) as other_city, 
    sum(trip_count) as trip_count 
    from trips 
    group by least(from_city, to_city), greatest(from_city, to_city) 
); 
+1

は、このSQL Serverの構文ですか?私は機能を見つけることができません! – FLICKER

+0

ああ、申し訳ありませんが、あなたは正しいです。 'LEAST'と' GREATEST'はすべてのDBMSで利用できますが、SQL Serverでは利用できません。私はそれを知らなかった。 (奇妙なことに、SQL Serverは20年ほど前からありましたが、これらの機能を追加していないのはなぜですか?2つの値を比較するのは大したことではありませんが、2つ以上の値をCASE WHENと比較しなければならないのは面倒です。) –

+0

これはまだ良い解決策です。 SQL Serverの場合、私はGeorgos Betsosが提案したことを実行します。 –

関連する問題