0

1 つの MySQL クエリで次のように記述する方法があるのは不思議です。

テーブルがあります: cust_ID | rpt_name | req_secs

私が取得したいクエリでは:

cust_ID でグループ化した場合の AVG req_secs

rpt_name でグループ化された場合の AVG req_secs

合計 req_secs AVG

同じテーブルに対して個別のグループ化クエリを実行してから、結果を 1 つに UNION できることを知っています。しかし、1回のクエリでそれを行う方法があることを望んでいました。

ありがとう。

4

3 に答える 3

1

さて、以下は3つのうち2つを行います:

select n,
       (case when n = 1 then cast(cust_id as varchar(255)) else rpt_name end) as grouping,
       avg(req_secs)
from t cross join
     (select 1 as n union all select 2
     ) n
group by n, (case when n = 1 then cust_id else rpt_name end);

これは基本的にデータを「2 倍」にしてから、各グループの集計を行います。cust_idこれは、とrpt_nameが互換性のある型であることを前提としています。(そうでない場合は、クエリを微調整できます。)

実際には、以下を使用して全体の平均を取得できますrollup

select n,
       (case when n = 1 then cust_id else rpt_name end) as grouping,
       avg(req_secs)
from t cross join
     (select 1 as n union all select 2
     ) n
group by n, (case when n = 1 then cast(cust_id as varchar(255)) else rpt_name end) with rollup

平均は元のデータと「2 倍」のデータで同じであるため、これは平均に対して機能します。sum()またはには機能しませんcount()

于 2013-07-16T18:16:45.490 に答える
0

いいえ、ありません。cust_ID と rpt_name の組み合わせで同時にグループ化することはできますが (つまり、2 つのレベルのグループ化)、別のトップレベルのグループ化とグループ化されていない集計を同時に行うことはできません。

于 2013-07-16T18:07:41.670 に答える