首页 > 解决方案 > 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

标签: sql

解决方案


您的加入不正确:

`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不是有效的列引用)


推荐阅读