Sql 求和时如何避免笛卡尔积(dif.表中的两个不同列)
SQL引擎:MSSQL 目标:合并两个不同的和 这是我的疑问: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
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