【问题标题】:How avoid cartesian product when we sum (Two different column from dif. Tables)当我们求和时如何避免笛卡尔积(来自不同表的两个不同的列)
【发布时间】:2014-08-15 09:25:18
【问题描述】:

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 

如何避免笛卡尔积 beetwen First Join 和 Second? 它为我生成了奇怪的结果:

最终结果是

(SUM of product * number_of_rows in d_additional) + (SUM of d_additional * number_of_rows in product), (SUM of product * number_of_rows in d_additional), (SUM of d_additional * number_of_rows in product)

我的错在哪里?

【问题讨论】:

  • 我使用了一个随机的 sql 格式化程序来格式化您的查询。它仍然很可怕,但比你发布它时要少......
  • @Sebas,固定语法 sql-a

标签: sql sql-server cartesian-product


【解决方案1】:

解决方案:

(将总和组从根移动到子)

 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

【讨论】:

    猜你喜欢
    • 2018-12-26
    • 2019-08-26
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    相关资源
    最近更新 更多