sql - LEFT JOIN 和 GROUP BY 带来双行
问题描述
运行以下代码时,我得到了重复的数据。有人帮我吗?
目标是在特定时间段内的前两列中列出产品和相应的订单。项目可能会重复,因为同一产品可能有多个订单。最后,在第三列中,我想查看该产品的总销售额,而不考虑订单号。总而言之,它应该是这样的:
产品 - 订单 - 产品的总销售额(每个订单的销售额,总销售额)
SELECT
OBITNO as "product",
OBORNO as "Order #",
summary
FROM MVXJDTA.OOLINE
LEFT JOIN (
SELECT
OBITNO as "product",
sum(OBORQA) as "summary"
FROM MVXJDTA.OOLINE
WHERE OBCONO=2 and OBWHLO=091 and OBCODT>20190701 group by OBITNO) md2
on OBITNO=OBITNO
WHERE OBCONO=2 and OBWHLO=091 and OBCODT>20190701
解决方案
您的加入不正确:
`on OBITNO=OBITNO`
在您的子查询中,您为该列指定OBITNO
了别名product
,因此相等运算符的两侧是同一列,因为这总是正确的,所以您将获得一个交叉连接。相反,您应该使用ON md2.Product = OOLINE.OBITNO
:
SELECT
o.OBITNO as "product",
o.OBORNO as "Order #",
md2.summery
FROM MVXJDTA.OOLINE AS o
LEFT JOIN
( SELECT o.OBITNO as "product",
SUM(o.OBORQA) as "summery"
FROM MVXJDTA.OOLINE AS o
WHERE o.OBCONO=2
AND o.OBWHLO=091
AND o.OBCODT>20190701
GROUP BY o.OBITNO
) AS md2
ON md2.product = o.OBITNO
WHERE o.OBCONO=2
AND o.OBWHLO=091
AND o.OBCODT>20190701
我倾向于确保在每个列名前加上表别名(通常即使只有一个表),这使得人们在阅读我的查询时更容易弄清楚数据来自哪里,这也意味着这样的事情发生得更少,因为它会导致错误(即md2.OBITNO
不是有效的列引用)
推荐阅读
- ios - 单击键盘上的“完成”以关闭键盘,但不会被关闭
- bash - 使用 Bash 将文本文件的最后 n 行移动到顶部
- vba - 使用 Find 函数未找到值的错误消息
- python - 调用具有错误输入类型的函数时打印“错误类型” - Python
- javascript - Display a div on mouse enter, cannot be seen if mouse position is in the right-most
- shell - 如何在 linux 中仅查找大于 100MB 或 1G 的文件夹
- performance - 某些静态资产的 HTTP 请求等待时间为 10 秒
- c# - 在 Linq 中取消提交到数据库
- docker - Nginx 没有在 docker 容器中运行
- html - 如何对齐 2 个 div 的左右对齐