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
我認真很害怕寫作與臨時表的存儲過程每個聚合。
任何幫助表示讚賞。
你能張貼一些樣本數據嗎?我可以看到幾個地方可能會把它扔掉,但這取決於你的數據的性質...... – PinnyM
你在查詢之間有不同的聚合深度。除了SupplierNumber之外,從頂部刪除select和group中的所有內容,然後查看是否合計。 –
此外,您可以輕鬆地將其更改爲動態SQL,因此您不必對日期進行硬編碼,也不需要每年進行sproc維護。 –