请求SQL:联接表,不要多个值

时间:2019-07-30 20:53:36

标签: mysql sql

我陷入了SQL查询中。原因是因为我添加了带有Left JOIN的表:

这是我的查询,问题出在Amount_tax_excl

SELECT [...]
  os.amount + os.shipping_cost_amount AS `amount`,
  (CASE 
    WHEN od.id_customization!=0 AND s.id_shop=3 THEN SUM(CAST(os.amount / 1.19 AS decimal(10,6)))
    WHEN od.id_customization!=0 AND s.id_shop=6 THEN SUM(osd.amount_tax_excl)
    WHEN od.id_customization!=0 AND s.id_shop!=3 THEN SUM(CAST(os.amount / 1.2 AS decimal(10,6)))
    ELSE SUM(osd.amount_tax_excl)
  END) AS amount_tax_excl,
  SUM(osd.amount_tax_incl) AS amount_tax_incl,
  os.shipping_cost_amount, os.partial,
  [...]
FROM  ps5_order_slip os
LEFT JOIN ps5_orders o ON (os.id_order = o.id_order)
LEFT JOIN ps5_order_detail od ON (o.id_order = od.id_order AND os.id_order = od.id_order)
LEFT JOIN ps5_shop s ON (o.id_shop = s.id_shop)
LEFT JOIN ps5_address a ON (o.id_address_delivery = a.id_address)
LEFT JOIN ps5_state e ON (a.id_state = e.id_state)
LEFT JOIN ps5_order_slip_detail osd ON (os.id_order_slip = osd.id_order_slip)
WHERE os.date_add >= '2019-07-01' AND os.date_add <= '2019-07-30 23:59:59'
GROUP BY os.id_order_slip

通常,结果应为645.35,如金额

https://imgur.com/fTWn7yS

我注意到这是因为order_detail表的原因,因为有6种产品。

所以645.35 * 6 = 3872.100000。 我使用DISTINCT,如果是ELSEIF,则没有任何效果 我确实需要此查询的变量od.id_customization,它就是该表中的变量。

https://imgur.com/hhVxrmR

(抱歉,我不知道如何直接在堆栈上显示图像)

感谢帮助

2 个答案:

答案 0 :(得分:0)

您仅使用标题ID联接到order_detail表。您需要使用线路级别ID来加入。

答案 1 :(得分:0)

我找到了一种方法,但我认为它很脏。

SELECT [...],
os.amount + os.shipping_cost_amount AS `amount`,
(CASE 
WHEN od.id_customization!=0 AND s.id_shop=3 THEN SUM(CAST(os.amount / 1.19 AS decimal(10,6))) / (Select COUNT(id_order) FROM ps5_order_detail WHERE id_order = os.id_order)
WHEN od.id_customization!=0 AND s.id_shop=6 THEN SUM(osd.amount_tax_excl) / (Select COUNT(id_order) FROM ps5_order_detail WHERE id_order = os.id_order)
WHEN od.id_customization!=0 AND s.id_shop!=3 THEN SUM(CAST(os.amount / 1.2 AS decimal(10,6))) / (Select COUNT(id_order) FROM ps5_order_detail WHERE id_order = os.id_order)
ELSE SUM(osd.amount_tax_excl) / (Select COUNT(id_order) FROM ps5_order_detail WHERE id_order = os.id_order)
END) AS amount_tax_excl,
SUM(osd.amount_tax_incl)  / (Select COUNT(id_order) FROM ps5_order_detail WHERE id_order = os.id_order) AS amount_tax_incl,
os.shipping_cost_amount, os.partial,
os.date_add, os.date_upd, e.`iso_code` AS `ISO Etat livraison`, e.`name` AS `Name Etat livraison`, a.city, o.`payment` AS `payment`
FROM  ps5_order_slip os
LEFT JOIN ps5_orders o ON (os.id_order = o.id_order)
LEFT JOIN  ps5_order_detail od ON (os.id_order = od.id_order)
[...]