1

我有以下查询:

select *, sum(hrs.WPTOTT) as "Hours"
  from mstwmlt 
 inner join MSTWMPRD hrs
    ON hrs.WPOPID  = wtopid and hrs.WPTRAN = wtttyp 
       and (wttdte BETWEEN hrs.WPSDTE AND hrs.WPEDTE)
 where (wtwh = ? OR ? = '*ALL') 
   AND (wtopid = ? OR ? = '*ALL') 
   AND (wtttyp = ? OR ? = '*ALL')  
   and ((wtco|| '/' || wtdiv) = ?)
 order by wttdte, wtopid, wtttme, wtttyp 

我需要选择所有内容和总和,有没有办法在不为每个单独字段编写长选择查询的情况下做到这一点?

4

2 回答 2

1

SUM如果不在这些列上使用 a,则不能与其他列一起应用和选择聚合函数GROUP BY

于 2012-10-02T13:20:17.490 回答
0

在 MySQL 以外的几乎任何数据库中,您都可以执行以下操作:

with t as (
    select *
      from mstwmlt 
     inner join MSTWMPRD hrs
        ON hrs.WPOPID  = wtopid and hrs.WPTRAN = wtttyp 
           and (wttdte BETWEEN hrs.WPSDTE AND hrs.WPEDTE)
     where (wtwh = ? OR ? = '*ALL') 
       AND (wtopid = ? OR ? = '*ALL') 
       AND (wtttyp = ? OR ? = '*ALL')  
       and ((wtco|| '/' || wtdiv) = ?)
    )
 select t.*,
        (select sum(wpptott) from t) as Hours 
 from t
 order by wttdte, wtopid, wtttme, wtttyp

不幸的是,我怀疑您使用的是 MySQL(因为它是唯一一个您的查询不会生成编译时错误的引擎,因为存在SUMGROUP BY子句)。在这种情况下,您基本上有三个合理的选择:

  1. 复制原始查询以获得总和。在相关子查询或 FROM 子句中执行此操作。
  2. 使用 ROLLUP 获取另一行的总和。
  3. 在数据库之外的应用层进行求和。
于 2012-10-02T13:54:17.827 回答