Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.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 求和时如何避免笛卡尔积(dif.表中的两个不同列)_Sql_Sql Server_Cartesian Product - Fatal编程技术网

Sql 求和时如何避免笛卡尔积(dif.表中的两个不同列)

Sql 求和时如何避免笛卡尔积(dif.表中的两个不同列),sql,sql-server,cartesian-product,Sql,Sql Server,Cartesian Product,SQL引擎:MSSQL 目标:合并两个不同的和 这是我的疑问: SELECT z.zlec_id AS zlec, ( CASE WHEN Sum(netto_blind_discout * p.count) IS NOT NULL THEN Sum( netto_blind_discout * p.count) ELSE 0 END

SQL引擎:MSSQL

目标:合并两个不同的和

这是我的疑问:

SELECT z.zlec_id AS zlec, 
       ( 
         CASE WHEN Sum(netto_blind_discout * p.count) IS NOT NULL 
         THEN 
             Sum( netto_blind_discout * p.count) 
         ELSE 
            0 
         END 
         + 
         CASE WHEN Sum(netto2 * d.count) IS NOT NULL 
         THEN 
             Sum(netto2 * d.count) 
         ELSE 
             0 
         END 
       ) AS res, 
       Sum(netto_blind_discout * p.count), 
       Sum(netto2 * d.count) 
FROM   zetter z 
       FULL OUTER JOIN 
      (
                       SELECT netto_blind_discout, 
                              count, 
                              zlec_id 
                       FROM   position
      ) AS p 
      ON z.zlec_id = p.zlec_id 

      FULL OUTER JOIN 
      (
                        SELECT netto2, 
                               count, 
                               zlec_id 
                        FROM   d_additional
      ) AS d 
      ON z.zlec_id = d.zlec_id 

WHERE  z.zlec_id = 123123 
GROUP  BY z.zlec_id 
如何避免笛卡尔积的第一次连接和第二次连接? 这对我来说是一个奇怪的结果:

最终结果是

乘积之和*d_addition中的_行数+d_addition之和*乘积中的_行数, 乘积之和*d_附加中的_行数_, d_之和*乘积中的_行数

我的错在哪里?

解决方案:

将总和为的组从根移动到子级

 SELECT z.zlec_id AS zlec, 
   ( 
     CASE WHEN sum_p IS NOT NULL 
     THEN 
         sum_p
     ELSE 
        0 
     END 
     + 
     CASE WHEN sum_d IS NOT NULL 
     THEN 
         sum_d
     ELSE 
         0 
     END 
   ) AS res, 
   sum_p, 
   sum_d
   FROM   zetter z,
  ( 

                   SELECT sum(netto_blind_discout * count) as sum_p, 
                          p.zlec_id 
                   FROM   zetter z 
                   Left join position p  
                   on z.zlec_id = p.zlec_id
                   Group by p.zlec_id 
  ) AS p, 
  (
                    SELECT sum(netto2 * count) as sum_d, 
                           d.zlec_id 
                   FROM   zetter z 
                   Left join d_additional d  
                   on z.zlec_id = d.zlec_id 
                   Group by d.zlec_id 
  ) AS d 
  WHERE  
      z.zlec_id = 123123 And 
      d.zlec_id = z.zlec_id and 
      p.zlec_id = z.zlec_id

我使用了随机sql格式化程序来格式化查询。这仍然很可怕,但比你发布的时候要少…@Sebas,修复了语法sql-a