Informix CASE 和求和结果
Informix CASE and summing results
经过几个月总是从这里得到我的答案而不必问而只是简单地在这里搜索:),我终于加入了:)。
我是 Informix 的新手,正在努力处理我的第一个 CASE 语句:
大致意思是,我是根据奖励计划的收入来奖励积分,其中两个月有双倍积分月。
我的 Select 看起来像这样:
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
虽然我的修复确实有效,但我想确保我做的正确。错误的代码很难维护。
我注意到 JL 在你的问题中的评论,并同意这是非常好的建议。
长话短说,您不能对 GROUP BY
子句中的列或表达式使用 labels/aliases。简单的解决方案是使用序数位置替代方案:GROUP BY 1, 2, 3, 4
对于它的价值,我更喜欢易读性的 CASE
声明的替代方法是:
DECODE(salesstat.int_num,
4, 0.2
8, 0.2
0.1) AS BLC_Points
(请随意处理最后一点。)
经过几个月总是从这里得到我的答案而不必问而只是简单地在这里搜索:),我终于加入了:)。
我是 Informix 的新手,正在努力处理我的第一个 CASE 语句:
大致意思是,我是根据奖励计划的收入来奖励积分,其中两个月有双倍积分月。
我的 Select 看起来像这样:
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
虽然我的修复确实有效,但我想确保我做的正确。错误的代码很难维护。
我注意到 JL 在你的问题中的评论,并同意这是非常好的建议。
长话短说,您不能对 GROUP BY
子句中的列或表达式使用 labels/aliases。简单的解决方案是使用序数位置替代方案:GROUP BY 1, 2, 3, 4
对于它的价值,我更喜欢易读性的 CASE
声明的替代方法是:
DECODE(salesstat.int_num,
4, 0.2
8, 0.2
0.1) AS BLC_Points
(请随意处理最后一点。)