如何通过函数的结果(总和)订购选择?

Posted

技术标签:

【中文标题】如何通过函数的结果(总和)订购选择?【英文标题】:How can I order a selection by the results of a function (sum)? 【发布时间】:2013-01-24 17:17:18 【问题描述】:

我有一张有一堆列的表。三列是整数,分别标记为消费、消费2和消费3。

我想选择表格的每一行,但是按照三个消费字段的总和降序排列。

我可以按每个消费列单独订购

order by consumption3 desc, consumption 2 desc, consumption desc

但我更愿意对这些值求和,然后按求和值排序。

我也可以编写一个 4GL 程序来做到这一点,但我试图在 SQL 中解决这个问题。

如果我这样做,

select  *
from    ws_bill
order by sum(consumption) + sum(consumption2) + sum(consumption3)

那么 Informix 的 SQL 需要 group by 列表中的每一列。

有没有更简单的方法可以做到这一点,还是我应该只写程序?

在 Ubuntu 12.04 上运行的 Informix SE/4GL 版本

ics@steamboy:~/icsdev$ dbaccess -V
DB-Access Version 7.25.UC6R1 
Software Serial Number ACP#J267193
ics@steamboy:~/icsdev$ fglpc -V

Pcode Version 732-750

Software Serial Number ACP#J267193
ics@steamboy:~/icsdev$ 

这是表格:

create table "ics".ws_bill 
  (
    yr char(2),
    bill_no integer,
    bill_month smallint,
    due_date date,
    tran_date date,
    prev_reading integer,
    curr_reading integer,
    consumption integer,
    consumption2 integer,
    consumption3 integer,
    water_charge money(10,2),
    sewer_charge money(10,2),
    other_charge decimal(10,2),
    curr_bal money(10,2),
    estimated char(1),
    prev_due_date date,
    time_billed datetime year to second,
    override char(1),
    curr_bal_save money(10,2)
  );
revoke all on "ics".ws_bill from "public";

create unique index "ics".ws_indx on "ics".ws_bill (bill_no,yr,
    bill_month);

这是本文接受的答案中表示的主要光标。

declare wb_cp cursor for
select  b.yr,b.bill_no,
        sum(b.consumption + b.consumption2 + b.consumption3) as adj_tot
into    cons_rec.* #defined record variable
from    ws_bill b
where   b.yr >= start_yearG and b.yr <= end_yearG
group   by b.yr, b.bill_no
order by adj_tot desc, b.yr desc, b.bill_no desc

【问题讨论】:

鉴于您使用的是 Informix-SE(标准引擎)而不是 Informix(动态服务器),您需要注意 SE 不支持现代 SQL 的许多便利功能,例如 sub - FROM 子句中的查询和 ANSI 样式的 JOIN 操作。这项工作可以完成,但如果您在这里提出问题,请务必提及 Informix-SE,否则您可能会收到适用于 Informix 11.70 但不适用于 Informix-SE 7.25 的答案。 (实际上,即使这样你也可能得到错误的答案,但它会帮助那些知道的人解决问题。) 你是对的。我没有得到正确的最高消费账户数。事实证明,我最终编写了一个 4GL 程序,对三个消费字段进行降序排序,然后在找到前 10 个消费账户后使用 continue foreach,直到下一个财政年度休息。 【参考方案1】:

您说的是对三列求和。这是一个简单的表达式(消费 + 消费 2 + 消费 3)。您不需要 sum(...) 函数,除非您想对要组合在一起的多行求和。

所以,你需要一些类似的东西:

select bill_no, bill_month, ..., (consumption + consumption2 + consumption3) as tot_sum
  from ws_bill
 order by tot_sum desc

【讨论】:

【参考方案2】:
select  *, (sum(consumption) + sum(consumption2) + sum(consumption3)) as tot_sum
from ws_bill
order by tot_sum desc

【讨论】:

最终将要求 group by list select *, (sum(consumption) + sum(consumption2) + sum(consumption3)) as tot_sum from ws_bill order by tot_sum desc #^ # 294 中的所有列:列 (yr) 必须在 GROUP BY 列表中。 # 我已将表格重新添加到原始帖子中。【参考方案3】:

您使用的是什么版本的 informix?假设您的表具有唯一标识符并且您的 informx 版本支持子查询,然后尝试:

SELECT *
FROM ws_bill w 
   JOIN (
      SELECT id, sum(consumption) + sum(consumption2) + sum(consumption3) as tot
      FROM ws_bill
      GROUP BY id
   ) w2 on w.id = w2.id
ORDER BY tot DESC

祝你好运。

【讨论】:

谢谢。这是您要求的信息。我会把它添加到原始帖子中。连接引发了语法错误,但我会继续寻找。 ics@steamboy:~/icsdev$ dbaccess -V DB-Access 版本 7.25.UC6R1 软件序列号 ACP#J267193 ics@steamboy:~/icsdev$ fglpc -V Pcode 版本 732-750 软件序列号 ACP#J267193 ics@steamboy: ~/icsdev$

以上是关于如何通过函数的结果(总和)订购选择?的主要内容,如果未能解决你的问题,请参考以下文章

如何在VBA函数中返回总和

如何使用递归函数计算和打印以下序列的前 N ​​个元素的总和

如何通过远距离以外的其他方式订购rails geocoder gem的结果

为啥我无法计算我订购的列的运行总和?

是否有“从列表的开头选择并减少直到结果满足谓词”的函数式编程习语?

如何计算使总和最小化的点?