2009-11-04 76 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