代码工作正常,直到COALESCE

时间:2014-11-12 19:02:21

标签: sql ibm-midrange db2-400

HI这段代码工作正常,直到最后一句话还有更多内容,但是想知道我们是否可以了解这是不正确的。 这是在ibm i(as400)

' SQL0199关键字选择未选中。有效令牌:使用跳过等待获取订单联盟除了优化'你能解释一下这个问题吗?

SELECT COUNT(*)
FROM DLIB.ORDHEADR,DLIB.TRANCODE,DLIB.TRA11  
WHERE OHCOM# = TSCOM# AND OHORD# = TSORD# 
AND (otCOM# = OHCOM# AND OTORD#= OHORD# AND ottrnc = 'AQC')
AND OHORDT IN('RTR','INT','SAM') 
AND OHREQD = replace(char(current date, iso), '-', '')  
AND OHHLDC = ' ' 
AND ( ( TSTATS IN('AEP','SPJ')  
      AND OHORD# NOT in (SELECT a.TSORD# 
                           FROM DLIB.TRANCODE a    
                           WHERE a.TSTATS IN('EEP','SPC')
                        )
      )
    OR TSTATS IN('EEP','SPC')
    AND OHORD# IN (SELECT DISTINCT(C.TSORD#) 
                    FROM DLIB.TRANCODE C
                    JOIN (SELECT DISTINCT (B.TSORD#), MAX(B.TSUTIM) AS C_TSUTIM,
                                    MAX(B.TSUDAT) AS C_TSUDAT 
                               FROM DLIB.TRANCODE B
                               WHERE B.TSTATS IN ('EEP','SPC','ECM','ECT',
                                                  'ECA','CEL','BOC','COM',
                                                  'COO','REV','MCO','CPA',
                                                  'ECV','ECC','EPT','EPM',
                                                  'CAT','CAC','CAM','CAS',
                                                  'MAC','004','006','600',
                                                  'MEP','EPC','CPK')  
                               GROUP BY B.TSORD#
                         ) q1 
                         ON  C.TSORD# = q1.TSORD#
                         AND C.TSUDAT = q1.C_TSUDAT
                         AND C.TSUTIM = q1.C_TSUTIM
                     WHERE C.TSORD# NOT IN (SELECT F.TSORD#
                                            FROM DLIB.TRANCODE F
                                            WHERE F.TSTATS IN ('SPJ','REL','EAS','REV', 
                                                               'STP','SPT','PPC','SPM', 
                                                               'BPA','BPB','BPC','BPD','BPE',
                                                               'BPF','BPG','BPH','BPI','BPJ', 
                                                               'BPK','BPL','BPM','BPN','CBM', 
                                                               'BPO','BPP','BAT','BCM',
                                                               'BAM','WAT','WAM','LBL','012', 
                                                               '006','600','004','SCP','CBA', 
                                                               'CBB','CBC','CBD','CBE',
                                                               'CBF','CBG','CBH','CBI','CBJ',
                                                               'CBK','CBL','CBM','CBN','CBO',
                                                               'CBP','CBQ','CBR','CBS',
                                                               'CBT','CBU','CBV','CBW',
                                                               'CBX','CBY','CBZ','CB1',
                                                               'CB2','CB3','CB4','CB5')
                                        )
                       AND C.TSTATS IN('EEP','SPC')
                  )
    )
    -- till here it's fine.

SELECT COALESCE(SUM(OdQty#),0) 

2 个答案:

答案 0 :(得分:1)

您需要GROUP BY使用SUM

SELECT COALESCE(SUM(Goals),0) AS TeamGoals
FROM Players
GROUP BY TeamId

答案 1 :(得分:0)

格式化代码后,我们可以更好地看到语句的各个部分的开始和结束位置,我们可以看到与之匹配的内容。

一直到"直到这里它很好"是一个SQL SELECT语句。您需要一个分号来开始下一个查询,该查询以SELECT COALESCE()开头,但由于没有FROM子句,因此不完整。一旦你将终结符放在第一个语句上就应该运行。

第二个问题是另一个问题。您没有向我们展示其余的代码。正如TeKapa所说,任何时候使用聚合函数都需要GROUP BY子句。但是,如果您还在结果中包含非聚合列,则只需要这样做。

SELECT TeamID, COALESCE(SUM(Goals),0) AS TeamGoals
  FROM Players
  GROUP BY TeamId

这将为您提供玩家中的每个TeamID,以及每个团队的总目标。您可能还会包含ORDER BY TeamID

但是如果你只是想要所有玩家的总和,那么说完

是完全有效的
SELECT SUM(Goals) AS TotalGoals
  FROM Players

退一步看来,您的查询似乎变得如此复杂,即使您可能难以管理它。希望其他人不会被要求维持这样的事情。

如果此类代码投入生产,我建议您找到模块化复杂性的部分方法,例如使用视图或公用表表达式。将这些值列表存储在表中,而不是对它们进行硬编码也是一个好主意。