Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用SQL创建矩阵_Sql_Sql Server 2008_Matrix - Fatal编程技术网

如何使用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)