Informix CASE和求和结果

时间:2015-02-11 23:22:08

标签: subquery case informix

经过几个月的努力,我终于在这里得到了答案而不必再问,而只是简单地在这里搜索:)。

我对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

虽然我的修复工作正常,但我想确保我做得很好。代码不正确很难维护。

1 个答案:

答案 0 :(得分: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

(请随意使用最后一位。)