首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >oracle sql联接和结果在某些行上加倍

oracle sql联接和结果在某些行上加倍
EN

Stack Overflow用户
提问于 2016-01-20 09:51:03
回答 1查看 1.9K关注 0票数 2

我有以下两个SQL语句,它们在某些行上返回两倍和,并希望得到一些帮助排序。

代码语言:javascript
运行
复制
SELECT *
FROM (
SELECT A.ITMCOD
    ,I.ITMDSC
    ,A.CTLGRP
    ,SUM(A.CASQTY) thesum
    ,(C.FIFODT + I.STPSHP) STOP_SHIP_DATE
FROM INVENT_VIEW A
INNER JOIN ITMMST I ON A.ITMCOD = I.ITMCOD
INNER JOIN CTLGRP C ON A.CTLGRP = C.CTLGRP
WHERE A.ITMCOD LIKE 'PS%687%'
GROUP BY A.ITMCOD
    ,I.ITMDSC
    ,A.CTLGRP
    ,C.FIFODT
    ,I.STPSHP
)
ORDER BY ITMCOD

我的第二次试验,我认为联接是问题所在,并返回相同的结果如下:

代码语言:javascript
运行
复制
SELECT INVENT_VIEW.ITMCOD
  ,ITMMST.ITMDSC
  ,CTLGRP.CTLGRP
  ,SUM(INVENT_VIEW.CASQTY) thesum
  ,(CTLGRP.FIFODT + ITMMST.STPSHP) STOP_SHIP_DATE
FROM INVENT_VIEW
  ,CTLGRP
  ,ITMMST
WHERE ITMMST.ITMCOD = INVENT_VIEW.ITMCOD
  AND (CTLGRP.CTLGRP = INVENT_VIEW.CTLGRP)
  AND (INVENT_VIEW.ITMCOD LIKE 'PS%687%')
GROUP BY INVENT_VIEW.ITMCOD
  ,ITMMST.ITMDSC
  ,CTLGRP.CTLGRP
  ,CTLGRP.FIFODT
  ,ITMMST.STPSHP

结果

代码语言:javascript
运行
复制
╔════════════╦════════════════╦══════════════╦══════════╦══════════════════╗
║  "ITMCOD"  ║    "ITMDSC"    ║   "CTLGRP"   ║ "THESUM" ║ "STOP_SHIP_DATE" ║
╠════════════╬════════════════╬══════════════╬══════════╬══════════════════╣
║ "PS00687A" ║ "gROOVY BRUSH" ║ "4066ZDPOO4" ║    93600 ║ 26-DEC-16        ║
║ "PS00687A" ║ "gROOVY BRUSH" ║ "5385POSOO4" ║     3600 ║ 08-MAY-18        ║
║ "PS00687A" ║ "gROOVY BRUSH" ║ "5299POS001" ║     9922 ║ 08-MAY-18        ║
╚════════════╩════════════════╩══════════════╩══════════╩══════════════════╝

错误在第一行,其中和应该是所显示的(46800)的一半。另外两个结果是正确的。

我试着在sum后面加上不同的值,但这只是返回第一行的第一个值,即3600。我也在SELECT语句之后放置了不同的位置,但这并没有什么区别。

在这方面会很感激的。

谢谢。

更新

感谢mef,他是正确的,在连接的表中的重复,我能够得到我想要的结果!我还编辑了SQL如下:

代码语言:javascript
运行
复制
SELECT *
FROM (
    SELECT A.ITMCOD
    ,I.ITMDSC
    ,A.CTLGRP
    ,SUM(A.CASQTY) QTY
    ,CASE 
        WHEN C.STPDAT IS NOT NULL
            THEN C.STPDAT
        ELSE (C.FIFODT + I.STPSHP)
        END AS STOP_SHIP_DATE
FROM INVENT_VIEW A
INNER JOIN ITMMST I ON A.ITMCOD = I.ITMCOD
INNER JOIN CTLGRP C ON (
        (A.CTLGRP = C.CTLGRP)
        AND (A.ITMCOD = C.ITMCOD)   <- added
        )
WHERE A.ITMCOD LIKE 'PS%'
    AND C.QASTAT = 'RL'      <- added
GROUP BY A.ITMCOD
    ,I.ITMDSC
    ,A.CTLGRP
    ,C.FIFODT
    ,I.STPSHP
    ,C.STPDAT
)
ORDER BY ITMCOD
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-20 09:59:49

INVENT_VIEWCTLGRP中,您的第一条记录可能有一个副本。

使用这两个查询进行检查,如果数据正确,每个查询都应该返回一个:

代码语言:javascript
运行
复制
-- check whether there is a duplicate inside INVENT_VIEW
select count(1) from INVENT_VIEW where CTLGRP = '4066ZDPOO4' and ITMCOD = 'PS00687A'

-- check whether there is a duplicate inside CTLGRP
select count(1) from CTLGRP where CTLGRP = '4066ZDPOO4'

如果其中一个查询返回高于一个的值,则源数据中有一个重复值。(您可能需要重复检查视图的查询)。

否则,如果两个查询都返回一个,则联接会出现问题。在这种情况下,请分享您的桌子的结构。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34896671

复制
相关文章

相似问题

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