2015-02-11 16 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