2016-05-31 66 views
1

我有一个主要的部件#s列表,我试图运行一个查询,说明引用了多少次部件#以及它是多少次有序,但似乎我做错了什么。报价单和订单ID号是唯一的,但总共有6500行,但对于某些零件,查询似乎返回38000。计数子记录在访问中使用主记录的次数sql

sqlselectstring = "Select dp.PartNumber, count (fqp.fk_spQuoteID) as [# Times Quoted],count(fop.fk_spOrderId) as [# Times Ordered] " & _ 
"From ((DimProduct As dp LEFT JOIN FactOrderProduct AS fop ON dp.PartNumber=fop.PartNumber) LEFT JOIN FactQuoteProduct as fqp on dp.PartNumber=fqp.PartNumber) " & _ 
"Group By dp.PartNumber;" 
+0

使用内嵌的意见获得前计数连接。所有3个表格之间的基数是人为地夸大了两个加入者的数量。 – xQbert

+0

你应该使用内连接代表左连接 –

回答

0

由于DimProduct和其他两个表之间的1-M,您可能需要您加入使用内嵌视图之前获得的计数:

SELECT dp.PartNumber 
     , FQPcnt as [# Times Quoted] 
     , FOPCnt as [# Times Ordered] 
FROM DimProduct As dp 
LEFT JOIN (Select PartNumber, count(fk_spOrderID) as FOPCnt FROM FactOrderProduct GROUP BY PartNumber) AS fop 
    ON dp.PartNumber=fop.PartNumber 
LEFT JOIN (Select PartNumber, count(fk_spQuoteID) as FQPCnt FROM FactQuoteProduct GROUP BY PartNumber) 
    fqp on dp.PartNumber=fqp.PartNumber 
Group By dp.PartNumber; 

或者您必须分别生成计数并合并结果;但是,让多个记录......

或(我不记得,如果获得支持的话......)使用相关子查询......

SELECT dp.PartNumber 
     , (Select count(fk_spQuoteID) as FQPCnt FROM FactQuoteProduct FQP WHERE dp.PartNumber=fqp.PartNumber) as [# Times Quoted] 
     , (Select count(fk_spOrderID) as FOPCnt FROM FactOrderProduct FOP WHERE DP.PartNumber=FOP.PartNumber) as [# Times Ordered] 
FROM DimProduct As dp 
+0

如果我没有4个复制和粘贴错误,它也会有帮助。更正了fk_spQuoteID的名称以及表FactQuoteProduct – xQbert

+0

Access支持相关的子查询 - 这是我要给的答案,但没有时间去测试它。 –

+0

谢谢我最终提出了单独运行计数和联合运行,但很高兴知道有一个相关查询,我可以在将来使用 –

0

试试这个:

sqlselectstring = "Select dp.PartNumber, count (fqp.fk_spQuoteID) as [# Times Quoted],count(fop.fk_spOrderId) as [# Times Ordered] " & _ 
"From ((DimProduct As dp INNER JOIN FactOrderProduct AS fop ON dp.PartNumber=fop.PartNumber) INNER JOIN FactQuoteProduct as fqp on dp.PartNumber=fqp.PartNumber) " & _ 
"Group By dp.PartNumber;" 
+0

给我结果相同 –