2013-01-10 55 views
0

我有一個老化的查詢,以12,24和36個月的時間間隔購買的物品數量及其成本。查詢運行得很好,但是我的總數與單個查詢用於查找某個特定供應商的總數不相加。SQL Server老化總計不匹配

見下文。

SELECT s.SupplierNumber as Supplier_Number 
    , s.suppliername as Supplier_Name 
    , i.supplierpartnum as Part_No 
    , SUBSTRING(e.account_code,1,5)/*+'-'+RIGHT(e.account_code,7)*/ as Account_Code 
    , CASE WHEN e.reference_code = '' 
     THEN 'NOREF' 
     ELSE reference_code 
     END as Reference_Code 
    , i.Commodity 
    , i.ShortDscrptn as Part_Desc 
    , i.unitofmeasure as UOM 
    , i.unitprice as Unit_Price 
, CASE WHEN h.OrderDate >= '2012-01-01' 
     AND h.OrderDate <= '2012-12-31' 
     THEN COUNT(i.Quantity) 
     ELSE 0 END as Annual_Qty_12 
, CASE WHEN h.OrderDate >= '2011-01-01' 
     AND h.OrderDate <= '2012-12-31' 
     THEN COUNT(i.Quantity) 
     ELSE 0 END as Annual_Qty_24 
, CASE WHEN h.OrderDate >= '2010-01-01' 
     AND h.OrderDate <= '2012-12-31' 
     THEN COUNT(i.Quantity) 
     ELSE 0 END as Annual_Qty_36 
, CASE WHEN h.OrderDate >= '2012-01-01' 
     AND h.OrderDate <= '2012-12-31' 
     THEN SUM(i.UnitPrice) 
     ELSE 0 END as Annual_Spend_12   
, CASE WHEN h.OrderDate >= '2011-01-01' 
     AND h.OrderDate <= '2012-12-31' 
     THEN SUM(i.UnitPrice) 
     ELSE 0 END as Annual_Spend_24 
, CASE WHEN h.OrderDate >= '2010-01-01' 
     AND h.OrderDate <= '2012-12-31' 
     THEN SUM(i.UnitPrice) 
     ELSE 0 END as Annual_Spend_36 
FROM ekp.dbo.SUPPLIER s 
JOIN ekp.dbo.ORDERHEADER h 
    ON s.SupplierID = h.SupplierID 
JOIN ekp.dbo.ORDERITEM i 
    ON h.OrderID = i.OrderID 
JOIN mgnt.dbo.ematch e 
    ON h.PONumber = e.po_ctrl_num 
    AND i.LineNumber = e.po_sequence_id 
WHERE h.OrderDate >= '2010-01-01' 
AND h.OrderDate <= '2012-12-31' 
GROUP BY s.SupplierNumber, s.SupplierName, i.SupplierPartNum, e.account_code 
, i.Commodity, i.UnitOfMeasure, i.UnitPrice, i.ShortDscrptn, h.OrderDate 
, e.reference_code 

我可以繼續複製結果到電子表格中,總結了Annual_Spend_12列特定Supplier,它不符合以下幾點:

SELECT SUM(i.unitprice) as Annual_Spend_12 
    FROM ekp.dbo.ORDERITEM i 
JOIN ekp.dbo.ORDERHEADER h 
    ON i.OrderID = h.OrderID 
JOIN ekp.dbo.Supplier s 
    ON h.SupplierID = s.SupplierID 
JOIN mgnt.dbo.ematch e 
    ON h.PONumber = e.po_ctrl_num 
    AND i.LineNumber = e.po_sequence_id 
WHERE s.SupplierNumber = '15302' 
AND h.OrderDate >= '2012-01-01' 
AND h.OrderDate <= '2012-12-31' 

這個查詢略高於總是合計出遠遠高於頂級查詢。我也總結和統計,整個集合來代替,而它也不符,實際上,它會產生相同的結果上查詢:

, COUNT(CASE WHEN h.OrderDate >= '2012-01-01' 
     AND h.OrderDate <= '2012-12-31' 
     THEN i.Quantity 
     ELSE 0 END) as Annual_Qty_12 
, COUNT(CASE WHEN h.OrderDate >= '2011-01-01' 
     AND h.OrderDate <= '2012-12-31' 
     THEN i.Quantity 
     ELSE 0 END) as Annual_Qty_24 
, COUNT(CASE WHEN h.OrderDate >= '2010-01-01' 
     AND h.OrderDate <= '2012-12-31' 
     THEN i.Quantity 
     ELSE 0 END) as Annual_Qty_36 
, SUM(CASE WHEN h.OrderDate >= '2012-01-01' 
     AND h.OrderDate <= '2012-12-31' 
     THEN i.UnitPrice 
     ELSE 0 END) as Annual_Spend_12   
, SUM(CASE WHEN h.OrderDate >= '2011-01-01' 
     AND h.OrderDate <= '2012-12-31' 
     THEN i.UnitPrice 
     ELSE 0 END) as Annual_Spend_24 
, SUM(CASE WHEN h.OrderDate >= '2010-01-01' 
     AND h.OrderDate <= '2012-12-31' 
     THEN i.UnitPrice 
     ELSE 0 END) as Annual_Spend_36 

我認真很害怕寫作與臨時表的存儲過程每個聚合。

任何幫助表示讚賞。

+0

你能張貼一些樣本數據嗎?我可以看到幾個地方可能會把它扔掉,但這取決於你的數據的性質...... – PinnyM

+0

你在查詢之間有不同的聚合深度。除了SupplierNumber之外,從頂部刪除select和group中的所有內容,然後查看是否合計。 –

+0

此外,您可以輕鬆地將其更改爲動態SQL,因此您不必對日期進行硬編碼,也不需要每年進行sproc維護。 –

回答

0

我的猜測是測試是錯誤的:您在第一個查詢中錯誤地將Excel中的值加起來。以下是在Excel中合併值的三種有效方法:

  • 過濾值並突出顯示該列。 Excel會將所選單元格中的值相加(Excel 2007及更高版本)。
  • 使用「SUMIF()」或「總和({})」來添加的總數爲一個給定的供應商
  • 使用樞軸表

一個group by的結果一定排序。他們可能看起來有點排序,但他們可能不會。進行聚合的一種方法是對數據進行排序,然後挑選出結果。但是,還有其他方法,例如哈希聚合。而且,在多線程環境中,您不知道哪個線程將按照什麼順序返回值。