2015-02-11 234 views
0

我终于加入了许多个月后总是从这里得到我的答案,而不必问,而只是在这里搜索:)。Informix CASE和求和结果

我是相当新的Informix和我与我的第一个case语句挣扎:

它的粗略的想法是,我基于收入奖励计划两个月授予点有双点个月。

我的选择看起来是这样的:

Select YearMonth, 
    Account_Number, 
    Customer_Name, 
    Gross_Revenue, 
    Gross_Revenue * BLC_multiplier BLC_Points 
from (
    Select salesstat.year_num||salesstat.int_num YearMonth, 
     Customer.cust_code Account_Number, 
     Customer.name_text Customer_Name, 
     sum(salesstat.net_amt-salesstat.return_net_amt) Gross_Revenue, 
     CASE 
     WHEN 
      salesstat.int_num in (4,8) 
     THEN 
      .02 
     ELSE 
      .01 
     END BLC_multiplier 
    from Customer, 
     salesstat, 
     warereptdetl, 
     Product, 
     maingrp 
    Where product.cmpy_code = 'AB' 
    and Product.part_code = salesstat.part_code 
    and salesstat.cmpy_code = 'AB' 
    and customer.cmpy_code = 'AB' 
    and customer.cust_code = salesstat.cust_code 
    and salesstat.rept_code = '0' 
    and warereptdetl.ware_code = salesstat.ware_code 
    and warereptdetl.cmpy_code = 'AB' 
    and salesstat.year_num||salesstat.int_num in ('201412','20151','20152','20153','20154','20155','20156','20157','20158','20159') 
    and salesstat.ord_ind in ('7','8') 
    and salesstat.stat_type_code = 'MLY' 
    and salesstat.int_num > 0 
    and warereptdetl.warereptgrp_code in('NSW','MNW') 
    and maingrp.maingrp_code = salesstat.maingrp_code 
    and maingrp.cmpy_code = 'AB' 
    and customer.ref6_code = 'BLC' 
    and customer.ref7_code in ('Y','U') 
    and customer.cust_code in ('408759','112348') 
    group by YearMonth, 
     Customer.cust_code, 
     Customer.name_text, 
     BLC_multiplier 
    Order by YearMonth asc, 
     Customer.cust_code asc 
    ) 

我想要做的这一切一气呵成类似:

Select salesstat.int_num MonthValue, 
     sum(salesstat.net_amt-salesstat.return_net_amt) Gross_Revenue, 
     sum(salesstat.net_amt-salesstat.return_net_amt) * 
     CASE 
     WHEN 
      salesstat.int_num in (4,8) 
     THEN 
      .02 
     ELSE 
      .01 
     END BLC_Points 

但是当我做它告诉我,BLC_Points需要在(它不能因为它是一个集合字段)

我也试过:

Select salesstat.int_num MonthValue, 
     sum(salesstat.net_amt-salesstat.return_net_amt) Gross_Revenue, 
     CASE 
     WHEN 
      salesstat.int_num in (4,8) 
     THEN 
      sum(salesstat.net_amt-salesstat.return_net_amt) * .02 
     ELSE 
      sum(salesstat.net_amt-salesstat.return_net_amt) * .01 
     END BLC_Points 

虽然我的修补程序确实可行,但我想确保我正确地做到了。不正确的代码很难维护。

+0

欢迎来到Stack Overflow作为海报。您的顶级查询缺少大量的SQL(一个左括号,至少一个GROUP BY子句,可能是WHERE子句,等等)。您能否提供查询的其余部分以及我们需要的表(或多个表)的大纲模式,最好是使用几行样本数据以及这些行所需的结果? – 2015-02-11 23:33:31

+0

使用最少代码是一个好主意 - 这就是所谓的创建一个MCVE([最小,完整,可验证示例](http://stackoverflow.com/help/mcve))或 SSCCE([Short,Self -Contained,Correct Example](http://sscce.org/))。但是,有必要提供足够完整的代码,我不知道你在做什么,因为FROM子句不完整或缺失。所以,尽可能多地移除,但要使其可行。 – 2015-02-11 23:46:52

+0

感谢Jonathan提示,我会确保我总是发布更全面的查询。 – 2015-02-11 23:49:58

回答

1

我注意到JL在你的问题上的评论,并同意这是非常好的建议。长话短说,您不能在GROUP BY子句中为列或表达式使用标签/别名。简单的解决方案是使用顺序位置选择:GROUP BY 1, 2, 3, 4


对于它的价值,给CASE语句的一个选择,我喜欢的可读性是:

DECODE(salesstat.int_num, 
     4, 0.2 
     8, 0.2 
     0.1) AS BLC_Points 

(不要与去年因为你喜欢。)

+0

我需要BY子句salesstat.int_num添加到组,但解码做什么,我需要 DECODE(salesstat.int_num, 4,总和(salesstat.net_amt-salesstat.return_net_amt)* 0.2, 8,SUM(salesstat .net_amt-salesstat.return_net_amt)* 0.2, sum(salesstat.net_amt-salesstat.return_net_amt)* 0.1)AS BLC_Points – 2015-02-13 00:21:50

+0

不这样做,看起来很头疼。试一试:'DECODE(salesstat.int_num,4,0.2,8,0.2,0.1)* SUM(salesstat.net_amt-salesstat.return_net_amt)' – RET 2015-02-13 00:25:36

+0

应用你的建议,它更干净。 – 2015-02-13 00:48:36