用于乘法的SQL查询

时间:2011-07-05 11:51:54

标签: sql-server

我有两个关系(SQL数据库中的表),只有纯数字。这两种关系可以想象为矩阵。

问题是编写一个SQL查询,将两个关系相乘,就像我们使用普通矩阵乘法一样。

我一直绞尽脑汁......但是没有用:O

任何人都可以帮我解决?????

表编号1: enter image description here

@ Aaron Bertrand:

我正在使用SQL Server 2008 R2 表格的截图是:

表1:

enter image description here

表2:

enter image description here

我使用了查询:

select t1.A,t2.B,SUM(t1.C*t2.C)
from Table_1 as t1 join Table_2 as t2 on t1.B=t2.A 
group by t1.A,t2.B   
order by t1.A

答案:

enter image description here

这种方式非常简单,而不是@Marcelo Cantos和@ypercube建议的原始Matrix方式...

2 个答案:

答案 0 :(得分:14)

假设以下结构:

A (row INT, col INT, value FLOAT)
B (row INT, col INT, value FLOAT)

你可以这样写:

SELECT A.row, B.col, SUM(A.value * B.value)
  FROM A JOIN B ON A.col = B.row
 GROUP BY A.row, B.col

编辑:使用表格的表格布局来模仿矩阵结构会使这个问题变得更加困难,至少有两个原因:

  1. 您不能以对称的方式处理行和列。
  2. 您无法轻松地引用元素来自的行。
  3. 最好的解决方法是在每个表中添加一个行号列...

    table1 (row, A, B, C)
    table2 (row, A, B, C)
    

    ...然后将我建议的结构合成为每张桌子上的一个视图......

    CREATE VIEW A
        SELECT row, 1, A FROM table1 UNION
        SELECT row, 2, B FROM table1 UNION
        SELECT row, 3, C FROM table1 UNION
    
    -- Ditto VIEW B
    

    ...最后使用上面的SQL来评估答案。如有必要,您可以编写另一个视图,将结果转换回表格结构。

    然而,坦率地说,我认为所有这些都是非常错误的。使用行/列/值结构(并且逻辑上更一致)比A / B / C / ...结构更好。例如,考虑使用row / col / value计算矩阵转置的容易程度:

    SELECT col AS row, row AS col, value
      FROM A
    

    或总和对角线:

    SELECT SUM(value)
      FROM A
     WHERE row = col
    

    并问自己这些结构使用起来有多容易。

    PS:关于逻辑连贯性的主题,你的表不是正确意义上的关系,因为它们在行上定义了一个顺序,并且必须允许重复的行,这两个行都没有关系,(松散地)定义为一组元组。如今,n维关系与二维表的这种混淆是数据管理不善的核心。

答案 1 :(得分:3)

我假设两个表都有(i, j, dataij)

其中i表示rowj表示column

SELECT a.i
     , b.j
     , SUM(a.dataij * b.dataij)
FROM table1 AS a
  JOIN table2 AS b
    ON a.j = b.i
GROUP BY a.i
       , b.j

使用这种数据结构,像乘法这样的矩阵之间的操作更容易。更难的是以通常的矩阵格式显示表格。一种方法是使用这样的东西(检查PIVOT,如果你有一个支持它的SQL-Server版本以实现它的其他方法):

SELECT
    MIN(CASE WHEN j=1 THEN dataij ELSE NULL END) AS column1
  , MIN(CASE WHEN j=2 THEN dataij ELSE NULL END) AS column2
  , MIN(CASE WHEN j=3 THEN dataij ELSE NULL END) AS column3
FROM tableX 
GROUP BY i
ORDER BY i
;