2009-11-04 51 views
1

對於開票應用程序,我正在對PHB進行工作,決定發票上列出的零件需要以非常特殊的順序進行。如果可能的話,我想用一個單獨的sql語句完成此操作。MS Access複雜訂單

本質上,爲了需要是這樣

  1. 的最昂貴的部分(但僅當有在$ 0中列出的其他部分)
  2. 爲$ 0
  3. 所有其它部件中列出的所有部件(或通過PART_ID的順序列出所有部分)
  4. 用( 「MISC-30」 的一個PART_ID所有份數, 「MISC-31」, 「TEMP」)
  5. 具有負數量的所有份數[返回]

還有的將需要加入,但是這必須由代碼

處理意見混雜到目前爲止,我有:

SELECT * 
FROM order_part 
WHERE ordid = 1234 
ORDER BY qty > 0, part_id NOT IN("MISC-30","MISC-31","TEMP"), part_id 

但我無法弄清楚如何合併前兩條規則

+0

這是價格最貴的部分還是數量? – JeffO 2009-11-04 21:18:03

+0

幾點:1)SELECT *是不好的做法; 2)在SELECT子句中'揭露'排序順序是一種很好的做法;在SQL中,您可以在ORDER BY子句中使用關聯名稱而不是完整表達式,但可悲的是Access數據庫引擎SQL並不是真正的SQL,儘管您可以使用子查詢來解決此問題,但遺憾的是Access數據庫引擎並未優化好:( – onedaywhen 2009-11-05 09:15:44

+0

這是一個僞示例,實際查詢時間相當長 – 2009-11-05 15:49:12

回答

3

既然你不得不放棄這個項目早就被搞亂;)

Select * 
    , IIF(((Select Count(*) from order_part 
     where orderid = 1234 and price = 0))=0 
      and price = ((select max(price) from  
       order_part where orderid = 1234 
      and qty >0 and part_id not in(("MISC-30","MISC-31","TEMP") 
     )), 1 
    , IIf(price = 0, 2 
    , IIf(part_id IN("MISC-30","MISC-31","TEMP"), 4 
    , IIf(qty < 0, 5 
    , 3)))) AS Part_Sort 
from order_part 
Order By Part Sort, part_id 

真的希望訪問了case語句。但是你可以構建這些嵌套的IIf,並根據你的邏輯提供一個排序數字。最後的「ELSE」部分是#3,因爲只是通過部件ID排序是第三選擇/不屬於這些其他類別。對不起,我知道括號是錯誤的。

+0

看起來這是一個微小的變化將起作用。謝謝。 – 2009-11-05 15:47:42

1

如果用一個select語句不可能做到這一點,那麼我會寫5個查詢,每個查詢都可以得到不需要交集的這個結束查詢的部分。然後爲每個查詢添加一個SortBy整數值並將它們聯合在一起(按SortBy值排序)。

我在SQL Server這樣做,我猜這是在Access可能...

+0

+1 5個查詢。我喜歡Keep-It-Simple:D方法。 – 2009-11-04 17:57:04

1

即使這是可能的一個單一的查詢,我覺得你應該爲自己和未來的開發者進行個別查詢並以其他方式將結果聯合起來。

唯一的例外是,如果性能是100%完全關鍵,並且您需要保存每個微秒。

但作爲一名開發人員和經理,我寧願看到一個初級團隊成員可以發現的維護代碼,而不是一些超級混亂的SQL語句。

+0

我是唯一的開發者,並且相信我已經與評論規則混爲一談了。但無論如何,我們需要一次打印出約500個。我能做的最多的是sql。 我可能最終使用子查詢做它,但我還不知道 – 2009-11-04 17:47:09

+0

另外,我也有一個18頁的文檔,描述如何格式化訂單,包括項目的順序以及需要怎樣的評論 – 2009-11-04 17:52:06

+0

UNION ALL將會非常快,但是,當然,排序結果不會使用底層索引。 – 2009-11-05 23:10:08

2

也許你的意思是你想要一個單記錄集即你的SQL的輸出可以由你的發票App處理?

你有沒有想過folling - 它不漂亮,但它可能工作。

Select * From 
(
    Select 1 as MyOrder .... rest of criteria 1 
    Union 
    Select 2 as MyOrder .... rest of criteria 2 
    Union 
    Select 3 as MyOrder .... rest of criteria 3 
    Union 
    Select 4 as MyOrder .... rest of criteria 4 
    Union 
    Select 5 as MyOrder .... rest of criteria 5 
) 
Order by MyOrder 
+0

這可以工作,但我如何得到它來確定是否有任何零件在$ 0列出 – 2009-11-04 18:01:54

+0

什麼是$ 0? - 這部分的單價是多少? – heferav 2009-11-04 20:46:37

+0

查詢#1將#2作爲where子句的一部分。 – JeffO 2009-11-04 21:22:59

-1

我的建議:讓這個讓你浪費你寶貴時間的人做這樣的虛擬事情!他必須是奴隸驅動者或什麼?如果你不能讓他解僱,就離開公司。

+0

+1儘管OP沒有權力解僱他的老闆,但這個原則是正確的 - PHB應該從他的上級譴責這種愚蠢付出,無論誰是誰。不知道低級程序員如何將信息傳達給他沒有向其報告的人,但這是理想世界中會發生的事情。 – 2009-11-05 23:13:30