如何优化此查询以缩小返回的结果集

时间:2016-02-24 12:13:14

标签: sql sql-server-2014

我有以下表结构:

enter image description here

我正在运行以下查询;

SELECT DISTINCT c.VatCountryCode,
od.IntrastatCommodityCode,
CAST(ROUND(SUM(od.Quantity *  od.UnitCost/vt.ConversionFactor),2) AS DECIMAL(12,2)) AS Value, 
SUM(od.Quantity) AS Quantity
  FROM Contacts c
  INNER JOIN OrderHeaders oh ON c.ContactId = oh.CustomerId
  INNER JOIN OrderDetails od ON oh.OrderId = od.OrderId
  INNER JOIN VatTransactions vt ON c.ContactId = vt.OriginatingContactId
WHERE c.VatCountryCode <> RTRIM('GB')
AND  c.ContactId = vt.originatingContactId 
AND vt.VatTransactionDate Between '20160101' AND '20160229' 
  GROUP BY VatCountryCode,IntrastatCommodityCode
  ORDER BY VatCountryCode,IntrastatCommodityCode

如图所示,结果如下:

enter image description here

在值和数量中返回的结果太高了,因为它应该只引用两个月的时间段,因此我猜测它实际上是从OrderDetails表中的所有记录中提取结果

InvoiceId和ContactId在VatTransactions表中引用,我用它来设置查询的日期范围。

我怀疑,但我不确定)这是一个我不应该只使用Inner Joins的情况。如果有人可以建议我尝试进行改动(以及为什么我可以将这些知识用于将来),我将非常感激

1 个答案:

答案 0 :(得分:0)

我认为可能是这一行:

vt.VatTransactionDate Between '20160101' AND '20160229'

您正在寻找两个字符串之间的值,而不是两个数字,这可能会产生令人困惑的结果。我会尝试:

CAST(vt.VatTransactionDate AS DECIMAL(12,2)) Between 20160101 AND 20160229