如何使用SQL创建矩阵
对于这样的地理数据记录:如何使用SQL创建矩阵,sql,sql-server-2008,matrix,Sql,Sql Server 2008,Matrix,对于这样的地理数据记录: START | END CITY1 | STATE1 | CITY2 | STATE2 ---------------------------------------------- New York | NY | Boston | MA Newark | NJ | Albany | NY Cleveland| OH | C
START | END
CITY1 | STATE1 | CITY2 | STATE2
----------------------------------------------
New York | NY | Boston | MA
Newark | NJ | Albany | NY
Cleveland| OH | Cambridge | MA
我想输出类似这样的内容,其中它计算以矩阵形式显示的开始/结束对:
| MA | NJ | NY | OH
------------------------------
MA | 0 | 0 | 1 | 0
NJ | 0 | 0 | 1 | 0
NY | 1 | 0 | 0 | 0
OH | 1 | 0 | 0 | 0
我可以看到
groupby
和COUNT
将如何找到数据,但我不知道如何显示为矩阵。有人有什么想法吗?在PostgreSQL 9.1上进行测试后,这似乎可以解决问题。它几乎肯定需要适应SQL Server(任何人都可以随时更新我的答案)
但是请注意,我的输出与您的略有不同——我不确定这是因为您的示例输出错误,还是因为我误解了您的要求:
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路由,第二次查询state2->state1路由,然后使用UNION ALL
将它们连接在一起
然后,对于每个目标状态,它为该行的原始状态运行一个SUM()
此策略应易于适应任何RDBMS。谢谢。这起作用了。在SQL中:
SUM(当dest='MA'然后1或0结束时)作为MA
。尽管如此,有没有一种方法可以避免写每一个SUM
,因为另外有50行呢?我认为没有任何方法可以避免。。。除了可能写入存储过程或函数之外。@Flimzy:+1表示好的解决方案
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)