5

次のような地理データ レコードを使用します。

START                  |  END

CITY1    |   STATE1    |   CITY2    |  STATE2
----------------------------------------------
New York |    NY       |  Boston    |   MA
Newark   |    NJ       |  Albany    |   NY
Cleveland|    OH       |  Cambridge |   MA

マトリックスとして表示される START/END ペアリングをカウントするこのようなものを出力したいと思います。

   |  MA  |  NJ  |  NY  |  OH
------------------------------
MA |  0   |  0   |  1   |  0
NJ |  0   |  0   |  1   |  0
NY |  1   |  0   |  0   |  0
OH |  1   |  0   |  0   |  0

GROUP BYデータを見つける方法COUNTはわかりますが、マトリックスとして表示する方法がわかりません。誰にもアイデアはありますか?

4

1 に答える 1

4

これは、PostgreSQL 9.1でテストされたトリックを行うようです。ほぼ確実にSQL Serverに適応させる必要があります(誰でも自由に私の答えを更新してください)。

SELECT start AS state,
    SUM((dest = 'MA')::INT) AS MA,
    SUM((dest = 'NJ')::INT) AS NJ,
    SUM((dest = 'NY')::INT) AS NY,
    SUM((dest = 'OH')::INT) AS OH
FROM (
    SELECT state1 AS start, state2 AS dest
        FROM routes
    UNION ALL
    SELECT state2 AS start, state1 AS dest
        FROM routes
) AS s
GROUP BY start
ORDER BY start;

ただし、私の出力はあなたのものとは少し異なることに注意してください-それがあなたのサンプル出力が間違っているためなのか、それともあなたの要件を誤解したためなのかはわかりません:

 state | ma | nj | ny | oh 
-------+----+----+----+----
 MA    |  0 |  0 |  1 |  1
 NJ    |  0 |  0 |  1 |  0
 NY    |  1 |  1 |  0 |  0
 OH    |  1 |  0 |  0 |  0
(4 rows)

このクエリは、state1 -> state2 ルートに対して 1 回、state2 -> state1 ルートに対して 2 回、テーブルを 2 回クエリすることによって機能し、それらを で結合しUNION ALLます。

次に、目的の状態ごとにSUM()、その行の元の状態に対して を実行します。

この戦略は、どの RDBMS にも簡単に適応できるはずです。

于 2012-07-11T23:48:25.710 に答える