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を使用していると思われます(これは、SUMwithoutGROUP BY句が存在するためにクエリがコンパイル時エラーを生成しない唯一のエンジンであるためです)。この場合、基本的に3つの合理的なオプションがあります。

  1. 元のクエリを複製して合計を取得します。これは、相関サブクエリ内またはFROM句で実行します。
  2. ROLLUPを使用して、別の行の合計を取得します。
  3. データベースの外部のアプリケーション層で合計を実行します。
于 2012-10-02T13:54:17.827 に答える