2011-04-12 66 views
0

以下查询应返回大约1159个结果,但只返回大约880个结果; 如果我只加入“c”宽度“mm”,我仍然可以得到1159个结果。只有当所有3个表格我得到880个结果。我也没有运气使用:RIGHT JOIN,RIGHT OUTER JOIN,LEFT OUTER JOIN,INNER JOIN。我试着用“()”和没有“()”的JOIN sintax也没有运气。我有一个查询做了2个左连接和1个GROUP BY,但我得到了缺少结果:

任何帮助表示赞赏

SELECT c.ccod, c.cetcm, c.cdscr, c.cpcul, c.cdent, mm.amexi, 

Sum(CASE WHEN m.mcdmv=11 THEN m.mqtd END), 

Sum(CASE WHEN m.mcdmv=2 THEN m.mqtd END), 

Sum(CASE WHEN m.mcdmv=13 THEN m.mqtd END), 
Sum(CASE WHEN m.mcdmv=14 THEN m.mqtd END), 

MAX(CASE WHEN m.mcdmv=82 THEN m.mdata END) 



FROM 
(zzz.ccc c 
LEFT JOIN zzz.mmmm mm ON c.crnp = mm.arncd) 
LEFT JOIN zzz.mm m ON m.mrncd = c.crnp 



WHERE 
((c.cetcm='xcd') OR 
(c.cetcm='ewfwe') OR 
(c.cetcm='fewfew') OR 
(c.cetcm='fewf')) AND 

(m.MDATA Between 20100101 And 20110406) AND 

((m.mcdmv=11) OR 
(m.mcdmv=12) OR 
(m.mcdmv=13) OR 
(m.mcdmv=14)) AND 

(mm.aarm=1) 


GROUP BY c.ccod, c.cetcm, c.cdscr, c.cpcul, c.cdent, mm.amexi 

ORDER BY c.ccod 
+0

给我们行计数不会帮助。如果你告诉我它应该返回7k行,为什么我要关心?什么是表/字段名称。 “GROUP BY”是最容易被误解的TSQL语法。 – JonH 2011-04-12 16:07:24

+0

您需要记住由于'OUTER' Join所保留的行将对'm'和'mm'中的列具有NULL值。你的'WHERE'子句然后消除这些行。 – 2011-04-12 16:09:41

+0

@Totty - 所以如果你完全评论Where子句,你仍然没有得到你想要的结果? Where条款的部分部分怎么评论?你需要将这些问题分解成小部分来隔离问题。 – Thomas 2011-04-12 16:10:25

回答

2

正如有人建议,你需要移动的标准对表的左侧加入到各自的ON子句:

SELECT c.ccod, c.cetcm, c.cdscr, c.cpcul, c.cdent, mm.amexi 
    , Sum(CASE WHEN m.mcdmv=11 THEN m.mqtd END) As Total11 
    , Sum(CASE WHEN m.mcdmv=12 THEN m.mqtd END) As Total12 
    , Sum(CASE WHEN m.mcdmv=13 THEN m.mqtd END) As Total13 
    , Sum(CASE WHEN m.mcdmv=14 THEN m.mqtd END) As Total14 
    , MAX(CASE WHEN m.mcdmv=82 THEN m.mdata END) As Max82 
FROM (zzz.ccc c 
    LEFT JOIN zzz.mmmm mm 
     ON (c.crnp = mm.arncd 
     And m.aarm = 1)) 
    LEFT JOIN zzz.mm m 
     ON (m.mrncd = c.crnp 
      And m.mcdmv In(11,12,13,14,82) 
      And m.MDATA Between #20100101# And #20110406#) 
WHERE c.cetcm In('xcd','ewfwe','fewfew','fewf') 
GROUP BY c.ccod, c.cetcm, c.cdscr, c.cpcul, c.cdent, mm.amexi 
ORDER BY c.ccod 

此外,我已经使用了IN函数,它可以让你传递一系列值。顺便说一句,访问将可能会阻止列聚合函数没有列别名。在这里我只是用了一些简单的东西。

+0

谢谢你的工作..现在看起来我有太多的记录..让我检查更好! – 2011-04-12 16:27:22

+0

“As Toatal11”和另一个As似乎没有在结果中更改我的列名...:s – 2011-04-12 16:28:50

+0

@Totty - Access可能希望那些用方括号包住的列表。例如。 “由于[总计11]” – Thomas 2011-04-12 17:04:03

相关问题