3

我有这些表, rolls并且rollsout. 我想执行左外连接。

劳斯莱斯

          |type|height|weight|Rate|
          -------------------------
          |RP  |2ft   | 200  | 100|
          |RP  |2ft   | 200  | 100|
          |RP  |2ft   | 200  | 100|
          |LD  |2ft   | 100  | 130|

推出

          |type|height|weight|Rate|
          -------------------------
          |RP  |2ft   | 200  | 100|
          |RP  |2ft   | 200  | 100|

SUMing、JOINing 和 GROUPings 之后的预期输出 ==>

          |type|height|SUM(rolls.weight)|SUM(rollsout.weight)|
          ----------------------------------------------------
          |RP  |2ft   | 600             | 400                |
          |LD  |2ft   | 100             | NILL               |

我的代码:

 SELECT rolls.hight,rolls.type,SUM(rolls.weight),SUM(rollsout.weight)
 FROM rolls 
 LEFT OUTER JOIN rollsout 
 ON rolls.hight = rollsout.hight AND rolls.type= rollsout.type 
 GROUP BY rolls.hight,rolls.type

但上述代码的 O/P 是

          |type|height|SUM(rolls.weight)|SUM(rollsout.weight)|
          ----------------------------------------------------
          |RP  |2ft   | 1200            | 1200               |
          |LD  |2ft   | 100             | NILL               |

我不知道我哪里出错了——你能解释一下吗?

4

2 回答 2

3

你没有做错任何事。这就是 JOIN 的行为

它是左侧的行数 X 右侧的行数,在您的情况下,它是 3 x 2 = 6。并且6 x 200 = 1200

试试这个

Select rolls.height,rolls.type, SUM(rolls.weight) as W, rollsout.Ww
 FROM rolls 
 LEFT JOIN
       (Select height,type, SUM(weight) as Ww 
         From rollsout GROUP BY height, type
       ) as rollsout
ON rolls.height = rollsout.height AND 
rolls.type= rollsout.type 
GROUP BY rolls.height,rolls.type

SQLFiddle

我知道这在 SQL Server 中不起作用,但它适用于 MySQL

于 2012-10-27T00:36:22.227 回答
0

它将 Rollsout 中每一行的所有 Rolls 与类型 RP 相加。您需要从 rollsout 中获取不同的行:

SELECT rolls.hight,rolls.type,SUM(rolls.weight),SUM(R2.weight)
 FROM rolls 
 LEFT OUTER JOIN (SELECT DISTINCT * FROM rollsout) AS R2 ON  
 ON rolls.hight = R2.hight AND rolls.type= R2.type 
 GROUP BY rolls.hight,rolls.type
于 2012-10-27T00:28:02.120 回答