相同的Exact在线查询在Excel的Invantive Control中,与客户执行时会产生不同的结果

我有以下查询来根据来自Exact Online的区域组创build收入报告:

select itemgroupcode , itemgroupdescription , code , description , country , postcodegebied , name , financialyear , financialperiod , sum(quantity) aantal , sum(amountdc) omzet , sum(quantity2jaar) aantal2014 , sum(omzet2jaar) omzet2014 , sum(quantity1jaar) aantal2015 , sum(omzet1jaar) omzet2015 , sum(quantityhuidigejaar) aantal2016 , sum(omzethuidigejaar) omzet2016 from ( select substr(act.postcode, 1, 2) , case when financialyear = year(getdate()) - 0 then amountdc else 0 end * -1 omzethuidigejaar , case when financialyear = year(getdate()) - 1 then amountdc else 0 end * -1 omzet1jaar , case when financialyear = year(getdate()) - 2 then amountdc else 0 end * -1 omzet2jaar , case when financialyear = year(getdate()) - 0 then quantity else 0 end quantityhuidigejaar , case when financialyear = year (getdate()) - 1 then quantity else 0 end quantity1jaar , case when financialyear = year(getdate()) - 2 then quantity else 0 end quantity2jaar , case when substr(act.postcode, 1, 2) >= '10' and substr(act.postcode, 1, 2) < '20' then '1000-1999' when substr(act.postcode, 1, 2) >= '20' and substr(act.postcode, 1, 2) < '30' then '2000-2999' when substr(act.postcode, 1, 2) >= '30' and substr(act.postcode, 1, 2) < '40' then '3000-3999' when substr(act.postcode, 1, 2) >= '40' and substr(act.postcode, 1, 2) < '50' then '4000-4999' when substr(act.postcode, 1, 2) >= '50' and substr(act.postcode, 1, 2) < '60' then '5000-5999' when substr(act.postcode, 1, 2) >= '60' and substr(act.postcode, 1, 2) < '70' then '6000-6999' when substr(act.postcode, 1, 2) >= '70' and substr(act.postcode, 1, 2) < '80' then '7000-7999' when substr(act.postcode, 1, 2) >= '80' and substr(act.postcode, 1, 2) <= '89' then '8000-8999' when substr(act.postcode, 1, 2) >= '90' and substr(act.postcode, 1, 2) <= '99' then '9000-9999' else 'unknown' end postcodegebied , -1 * tle.amountdc , tle.financialperiod , tle.financialyear , act.country , act.name , itm.code , itm.description , tle.quantity , itm.itemgroupdescription , itm.itemgroupcode from transactionlines tle join exactonlinerest.crm.accounts act on act.code = tle.accountcode join exactonlinerest.financial.glaccounts glt on glt.code = tle.glaccountcode -- -- Type 110: grootboekrekening van het type omzet -- and glt.type = 110 join exactonlinerest.logistics.items itm on tle.itemcode = itm.code -- -- zodat er alleen transacties worden meegenomen die op een artikel geboekt zijn. -- where tle.itemcode is not null ) tle2 group by itemgroupcode , itemgroupdescription , code , description , country , postcodegebied , name , financialyear , financialperiod order by itemgroupcode , financialyear , itemgroupdescription , code , description , country , postcodegebied , name , financialperiod 

在客户的机器上执行此查询时,我期望得到相同的结果。 但结果是不同的。 每个数量和数量乘以因子8,取决于查询是以在线用户“ME@acme.com”还是“OTHERPERSON@acme.com”运行。

这怎么可能发生,我将如何能够解决这个问题?

您的查询错过了一些优化,并不包括完整的连接条件。

请注意,例如一个项目的唯一的自然或商业关键是分裂(公司)和项目代码,所以总是包含在连接。 如果您忘记在适用的情况下包括划分,则在使用相同(副本)划分的情况下,将行数相乘。 非副本你会得到不同的结果。

假设你获得了8倍的数量和3个连接的存在,我猜你有时会在Exact Online中select2个相同/复制的分区,导致功耗(2,3)= 8倍。

此外,您正在检索许多总帐事务处理行,而不是像3岁或以上的那样在汇总中使用。 最好先用financialyear >= ...这样的条款排除这些条款。

正确的查询应该是这样的:

 select itemgroupcode , itemgroupdescription , code , description , country , postcodegebied , name , financialyear , financialperiod , sum(quantity) aantal , sum(amountdc) omzet , sum(quantity2jaar) aantal2014 , sum(omzet2jaar) omzet2014 , sum(quantity1jaar) aantal2015 , sum(omzet1jaar) omzet2015 , sum(quantityhuidigejaar) aantal2016 , sum(omzethuidigejaar) omzet2016 from ( select substr(act.postcode, 1, 2) , case when financialyear = year(getdate()) - 0 then amountdc else 0 end * -1 omzethuidigejaar , case when financialyear = year(getdate()) - 1 then amountdc else 0 end * -1 omzet1jaar , case when financialyear = year(getdate()) - 2 then amountdc else 0 end * -1 omzet2jaar , case when tle.financialyear = year(getdate()) - 0 then tle.quantity else 0 end quantityhuidigejaar , case when tle.financialyear = year (getdate()) - 1 then tle.quantity else 0 end quantity1jaar , case when tle.financialyear = year(getdate()) - 2 then tle.quantity else 0 end quantity2jaar , case when substr(act.postcode, 1, 2) >= '10' and substr(act.postcode, 1, 2) < '20' then '1000-1999' when substr(act.postcode, 1, 2) >= '20' and substr(act.postcode, 1, 2) < '30' then '2000-2999' when substr(act.postcode, 1, 2) >= '30' and substr(act.postcode, 1, 2) < '40' then '3000-3999' when substr(act.postcode, 1, 2) >= '40' and substr(act.postcode, 1, 2) < '50' then '4000-4999' when substr(act.postcode, 1, 2) >= '50' and substr(act.postcode, 1, 2) < '60' then '5000-5999' when substr(act.postcode, 1, 2) >= '60' and substr(act.postcode, 1, 2) < '70' then '6000-6999' when substr(act.postcode, 1, 2) >= '70' and substr(act.postcode, 1, 2) < '80' then '7000-7999' when substr(act.postcode, 1, 2) >= '80' and substr(act.postcode, 1, 2) <= '89' then '8000-8999' when substr(act.postcode, 1, 2) >= '90' and substr(act.postcode, 1, 2) <= '99' then '9000-9999' else 'unknown' end postcodegebied , -1 * tle.amountdc , tle.financialperiod , tle.financialyear , act.country , act.name , itm.code , itm.description , tle.quantity , itm.itemgroupdescription , itm.itemgroupcode from transactionlines tle join exactonlinerest..accounts act on act.code = tle.accountcode and act.division = tle.division join exactonlinerest..glaccounts glt on glt.code = tle.glaccountcode -- -- Type 110: GL Account of type Revenue. -- and glt.type = 110 and glt.division = tle.division join exactonlinerest.logistics.items itm on itm.code = tle.itemcode and itm.division = tle.division -- -- Only transaction lines with an item. -- where tle.itemcode is not null -- -- Only journal for revenues. -- and tle.journalcode = '70' -- -- Optimization: not interested in older transactions than 2 years. -- and tle.financialyear >= year(getdate()) - 2 ) tle2 group by itemgroupcode , itemgroupdescription , code , description , country , postcodegebied , name , financialyear , financialperiod order by itemgroupcode , financialyear , itemgroupdescription , code , description , country , postcodegebied , name , financialperiod