首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >LEFT JOIN和GROUP BY会产生两个行

LEFT JOIN和GROUP BY会产生两个行
EN

Stack Overflow用户
提问于 2019-07-25 22:38:18
回答 3查看 66关注 0票数 0

当运行下面的代码时,我得到了重复的数据。有谁能帮帮我吗?

目标是在特定时间段内在前两列中列出产品和相应的订单。由于同一产品可能有多个订单,因此项目可能会重复。最后,在第三列中,我希望看到该产品的总销售额,而不考虑订单号。总而言之,应该是这样的:

product - order -产品的总体销售额(每个订单的销售额,总体销售额)

代码语言:javascript
运行
复制
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
EN

回答 3

Stack Overflow用户

发布于 2019-07-25 22:43:39

您的联接不正确:

代码语言:javascript
运行
复制
`on OBITNO=OBITNO`

在您的子查询中,您为列OBITNO提供了别名product,因此相等运算符的两端都是同一列,因为这将始终为真,因此您将得到一个交叉联接。相反,您应该使用ON md2.Product = OOLINE.OBITNO

代码语言:javascript
运行
复制
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不是有效的列引用)

票数 1
EN

Stack Overflow用户

发布于 2019-07-25 22:43:24

复制将来自您的join中的某个东西--但我不认为join真的是必要的。除非我误解了,否则您似乎是在对同一个表进行连接,以便获得总和。但是您可以使用窗口函数直接获得内联总和。

试试这个:

代码语言:javascript
运行
复制
SELECT
    OBITNO as "product", 
    OBORNO as "Order #",
    sum(OBORQA) over(partition by OBITNO) as "summery" 
FROM MVXJDTA.OOLINE 
WHERE OBCONO=2 and OBWHLO=091 and OBCODT>20190701
票数 0
EN

Stack Overflow用户

发布于 2019-07-25 22:44:27

注意别名

代码语言:javascript
运行
复制
SELECT OBITNO as "product"
    , OBORNO as "Order #"
    , summery FROM MVXJDTA.OOLINE md1 
    LEFT JOIN ( 
            SELECT OBITNO as "product"
            , sum(OBORQA) as "summery" 
              FROM MVXJDTA.OOLINE WHERE OBCONO=2 and OBWHLO=091 and 
              OBCODT>20190701 group by OBITNO) md2 
    on md2.OBITNO=md1.OBITNO
WHERE md2.OBCONO=2 and md2.OBWHLO=091 and md2.OBCODT>20190701
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57204562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档