0

我有一個數據庫,其中有13種不同的產品,在6個不同的國家銷售。Access 2013 SQL在必要時執行線性插值

價格每年上漲一次。

價格需要使用線性插值方法計算。每個國家每種產品每年有21種不同的價格和數量增量。

用戶需要能夠看到多少訂單將花費任何給定的價值(如你所期望的)。 (!英文)

什麼數據庫需要做的是:

如果從TblOrderDetail在TblPrices匹配的數量, 使用價格爲當前產品,國家和年份

如果沒有匹配量,但需求數量大於1000一個產品(GT)和大於100爲每一個其他產品: 查找產品,國家和年內最高量(小號o,1000或100,取決於產品),並計算按比例分攤的價格。例如。如果有人想在2015年爲英國購買1500件產品GT,我們會考慮2015年英國1000 GT的價格,並將其乘以1.5。如果需要1800,我們會乘以1.8。我一直沒有能夠得到這個工作,因爲我正在與下一個可能性的公式一起看它...

如果沒有匹配的數量,並且所需的數量少於1000產品GT,但其他產品爲100(這是常態)... 找到數量和價格直接低於用戶所需的產品,國家和年份所需的數量(讓我們稱這些數量低於price below)

查找所需產品,國家和年份用戶所需數量正上方的增量數量和價格(我們稱之爲數量上限和價格)

使用此公式計算特定國家/地區帳戶持有人在特定國家/地區的所需產品數量的價格。

ActualPrice: PriceBelow + ((PriceAbove - PriceBelow) * (The quantity required in the order detail - QuantityBelow)/(QuantityAbove - QuantityBelow)) 

我已經花了幾天時間,並已就此尋求建議,但我仍然陷入困境。是

我一直在努力,試圖使這項工作的表格如下:

TblAccount(主鍵是帳戶ID,它也有一個國家字段,加入到TblCountry.Code(主鍵)

TblOrders(主鍵是訂單ID),它通過AccountID字段加入TblAccount;通過OrderID加入TblOrderDetail。此表還包含鏈接到TblContact中某個人的OrderDate和Recipient ID - 我不需要這裏,但稍後需要它來生成發票

TblOrderDetail(主鍵是DetailID),它通過OrderID連接到TblOrders領域;通過產品id字段TblProducts,並保持所要求的數量以及產品

TblProducts(主鍵是產品代碼),它以及加入到TblOrderDetail,還加入通過產品字段到TblPrice

TblPrices鏈接到TblProducts(正如您剛剛閱讀的)。我還爲TblCountry(CountryAliasForProductCode)創建了別名,以便我可以將其鏈接到TblPrices以顯示國家/地區鏈接。我不確定是否需要這樣做 - 如果我這樣做,或者我不這樣做,這是行不通的,所以我在這裏再次尋求指導。

這是我一直在嘗試使用(和失敗)讓我的價格代碼和數量上面的步驟,我希望能複製它,使一對夫婦的調整來獲得下面的步驟:

SELECT MIN(TblPrices.stepquantity) AS QuantityAbove, MIN(TblPrices.StepPrice) AS PriceAbove, TblOrders.OrderID, TblOrders.OldOrderID, TblOrders.AccountID, TblOrders.OrderDate, TblOrders.RecipientID, TblOrders.OrderStatus, TblOrderDetail.DetailID, TblOrderDetail.Product, TblOrderDetail.Quantity 

FROM (TblCountry INNER JOIN ((TblAccount INNER JOIN TblOrders ON TblAccount.AccountID = TblOrders.AccountID) INNER JOIN (TblOrderDetail INNER JOIN TblProducts ON TblOrderDetail.Product = TblProducts.ProductCode) ON TblOrders.OrderID = TblOrderDetail.OrderID) ON TblCountry.Code = TblAccount.Country) INNER JOIN (TblCountry AS CountryAliasForProduct INNER JOIN TblPrices ON CountryAliasForProduct.Code = TblPrices.CountryCode) ON TblProducts.ProductCode = TblPrices.Product 

WHERE (StepQuantity >= TblOrderDetails.Quantity) 
AND (TblPrices.CountryCode = TblAccount.Country) 
AND (TblOrderDetail.Product = TblPrices.Product) 
AND (DATEPART('yyyy', TblPrices.DateEffective) = DATEPART('yyyy', TblOrders.OrderDate)); 

我也試過... 我甚至嘗試回到基礎知識,並嘗試再次在1查詢中生成以下步驟,然後嘗試在另一個上面的步驟,最後,在另一個創建最終計算查詢。

這就是我一直在試圖讓我的價格和數量如下:

SELECT Max(StepQuantity) AS quantity_below, Max(StepPrice) AS price_below, TblOrderDetails.Quantity, TblAccounts.Country 
FROM  
(TblProducts INNER JOIN TblPrices ON TblProducts.ProductCode = TblPrices.Product) 
(TblOrderDetail INNER JOIN TblProducts ON TblOrderDetail.Product = TblProducts.ProductCode) 
(TblOrders INNER JOIN TblOrderDetail ON TblOrders.OrderID = TblOrderDetail.OrderID) 
(TblAccount INNER JOIN TblOrders ON TblAccount.AccountID = TblOrders.AccountID), 
WHERE (((TblPrices.StepQuantity)<=(TblOrderDetail.Quantity)) AND ((TblPrices.CountryCode)=([TblAccounts].[country])) AND ((TblPrices.Product)=([TblOrderDetail].[product])) AND ((DatePart('yyyy',[TblPrices].[DateApplicable]))=(DatePart('yyyy',[TblOrders].[OrderDate])))); 

您可以看到這個明顯的錯誤,但我恐怕不能。我嘗試過重新調整它,但我無處可去。

我需要能夠將信息綁定到OrderDetail記錄,因爲生成的價格需要作爲借方金額添加到財務交易表中,並將顯示爲報表中的欠款額。

我真的不是很擅長SQL。我通過幾本自學書閱讀和工作,之前我曾問過這個問題的一部分;但我真的很掙扎着。如果任何人有任何關於如何繼續的想法,或者即使我的代碼出錯了,我也會很高興,即使你告訴我我不應該使用SQL。爲了記錄,我最初在Visual Basic下的其他論壇上發佈了這個問題。來自該論壇的迴應讓我感受到了SQL - 但是,任何有效的工作都會很好!

我甚至試過,使用Excel,串聯年度&產品&國家&數量得到一個唯一的產品代碼,內插的價格爲每個產品,國家和年份1和1000之間的所有數量和帶領他們進入一個TblProductsAndPrices表。在Access中,我創建了一個查詢來連接年(來自tblOrders的訂單日期)& Product(of tblorderdetails)& Country(of tblAccount),以獲得訂單所需的產品代碼。另一個查詢會爲我找到一個價格。但是,沒有出現在清單上的任何產品代碼(如數量未在tblProductsAndPrices中列出,因爲它大於最高價格增量)沒有價格。

如果有一個可行的解決方案,我剛纔所描述的將會產生一切的價格,那麼我會很高興。

我真的很希望能夠在任何日期爲任何國家的任何賬戶生成任何數量的任何產品訂單,並檢索將用於在數據庫中「借記」金融賬戶的價格,他們在賬戶的交易歷史中出現在報表上。我也希望能夠現場進行專門的價格檢查。

非常感謝您花時間閱讀本文。對此,我真的非常感激。如果你能提供任何幫助或鼓勵的話,我會非常感激。

非常感謝 卡倫

+0

請不要用你的名字簽字,而且這是一個很長的職位需要? – 2015-03-18 22:03:09

+0

感謝您的意見以賽亞。我會記住這一點。這是我在這裏的第一篇文章。 – 2015-03-18 22:53:55

+0

卡倫(以賽亞似乎有一個糟糕的一天,對不起),我通常使用VBA這樣的任務 - 這意味着打開和搜索記錄集,如果可能找到值,繼續下一個任務,等等。你可以按照你的英語邏輯逐步建立。一系列的查詢可以成爲其中的一部分,但調試和維護更容易。 – Gustav 2015-03-19 09:03:08

回答

0

也許沒有人認爲在一個簡單的解決問題的辦法,因爲不是所有的心目中數據庫思維工作。

簡單的解決方案:創建一個視圖,它提供所有計算值,不僅是最後一個需要的值,而且每個值都是一列。然後,您可以在關係視圖中使用這樣的視圖,並在某些行上使用其中一個值,在其他行上使用其他值等。

如何思考很簡單,按相反順序思考,而不是思考「如果那樣我需要計算這樣的其他東西我需要這個其他的「,認爲是」我需要「這樣的」,我需要「這個其他」,都是中間視圖的列,然後在頂層思考「如果」這將是另一種觀點,這樣的說法會選擇正確的值忽略其它

永遠不要試圖解決所有的一步到位,這可以是一個真正的大頭痛

優點:你可以隔離計算值(需要與否), sql更容易編寫和維護艾因。

缺點:資源使用量大於最小值,但大多數時候額外的計算值並不代表真正的巨大影響。

就教程而言:使用Down-Top方法代替自頂向下的方法。

有時候,比較好(用你的例子)計算所有三個值(你用粗體書寫句子)忽略if部分,併爲你的訂單計算所有三個可能的值,然後放棄不想要的值,只計算一個。

試圖計算只有一個是思考作爲一個程序編程,當與數據庫工作大多數時候必須擺脫這樣的想法,並認爲是相反的,首先做這種程序編程的最內部的一部分,收集所有的數據,然後做程序編程的外部選擇。

注意:如果其中一個值不能計算,只需生成一個空值。

我知道在First in,Last out(Down-Top)模型中很難去思考,但它對於你想要的東西來說很棒。

第一步(在特定的視圖,或從每次計算一個視圖加入):

  • 計算塔1作爲price for the current product, country and year
  • 計算柱2作爲calculate a pro-rated price as if 1000
  • 計算第3欄爲calculate a pro-rated price as if 100
  • 計算第4列爲etc
  • 計算第N列爲etc

步驟2(另一種觀點,一個你想要的):

  • 計算,如果一部分,所以你可以選擇從一個視圖足夠的列(你可以,如果還是計算輔助場立即使用)。

希望你能遵循的思維theese方式,我已經解決了很多事情就像這樣想,一個(和更復雜),但它是不容易想到的是,需要額外的努力。