列のことでグループを使用して集計SQL一つずつ

シン:

シナリオ:

以下は、私のテーブルです。

+-------+-----------+--------+--------+
|col2   |col3       |col4    |col5    |
+-------+-----------+--------+--------+
|    1.0|          2|       a|      a1|
|    1.0|          1|       a|      a2|
|    1.0|          2|       b|      a3|
|    2.0|          1|       a|      a1|
|    2.0|          1|       a|      a2|
+-------+-----------+--------+--------+

私は以下のように集計結果を取得する必要があります。

+-------+-----------+-----------+-----------+-----+
|col2   |col3       | field_name|field_value|count|
+-------+-----------+-----------+-----------+-----+
|    2.0|          1|   col3    |          1|    2|
|    1.0|          1|   col3    |          1|    1|
|    1.0|          2|   col3    |          2|    2|
|    2.0|          1|   col4    |          a|    2|
|    1.0|          1|   col4    |          a|    1|
|    1.0|          2|   col4    |          a|    1|
|    1.0|          2|   col4    |          b|    1|
|    1.0|          1|   col5    |         a2|    1|
|    1.0|          2|   col5    |         a1|    1|
|    1.0|          2|   col5    |         a3|    1|
|    2.0|          1|   col5    |         a1|    1|
|    2.0|          1|   col5    |         a2|    1|
+-------+-----------+-----------+-----------+-----+

ソリューションの実装:

私は、3つの異なるテーブル[T1、T2、T3]を作成することにより溶液を導入しました。そして、各テーブルのために、私は単一のテーブルにすべてを組み合わせて、プログラム[rowset1、rowset2、rowset3]を作成しました

select col2, col3, col3, count(*) from calc group by col2, col3;
T1 :
|col2   |col3       |col3       |count|
+-------+-----------+-----------+-----+
|    2.0|          1|          1|    2|
|    1.0|          1|          1|    1|
|    1.0|          2|          2|    2|
+-------+-----------+-----------+-----+

rowset1 = [[2.0,1,col3,1,2,18000], [1.0,1,col3,1,1,18000], [1.0,2,col3,2,2,18000]]

select  col2, col3,  col4, count(*) from calc group by col2, col3, col4;
T2:
+-------+-----------+--------+-----+
|col2   |col3       |col4    |count|
+-------+-----------+--------+-----+
|    2.0|          1|       a|    2|
|    1.0|          1|       a|    1|
|    1.0|          2|       a|    1|
|    1.0|          2|       b|    1|
+-------+-----------+--------+-----+
rowset2 = [[2.0,1,col4,a,2,18000], [1.0,1,col4,a,1,18000], [1.0,2,col4,a,1,18000],[1.0,2,col4,b,1,18000]]

select col2, col3, col5 , count(*) from calc group by col2, col3, col5;
T3:
+-------+-----------+--------+-----+
|col2   |col3       |col5    |count|
+-------+-----------+--------+-----+
|    1.0|          1|      a2|    1|
|    1.0|          2|      a1|    1|
|    1.0|          2|      a3|    1|
|    2.0|          1|      a1|    1|
|    2.0|          1|      a2|    1|
+-------+-----------+--------+-----+

rowset3 = [1.0,2,col5,b,1,18000], [1.0,1,col5,a2,1,18000], [1.0,2,col5,a1,1,18000], [1.0,2,col5,a3,1,18000], [2.0,1,col5,a1,1,18000], [2.0,1,col5,a2,1,18000]]


問題点

どのように私はrowset1,2,3を作成し、単一のテーブルにそれを組み合わせるのオーバーヘッドなしSQLで同じことを達成することができますか?

ゴードン・リノフ:

私が正しく理解していれば、あなたは1で3件の集計をしたいです。一つの方法は、使用することですcross join各凝集を区別するための情報をもたらすこと:

select col2, col3, field_name,
       (case when field_name = 'col3' then col3
             when field_name = 'col4' then col4
             when field_name = 'col5' then col5
        end) as field_value,
       count(*) as cnt
from t cross join
     (select 'col3' as field_name union all
      select 'col4' as field_name union all
      select 'col5' as field_name
     ) f
group by col2, col3, field_name, field_value
order by field_name, col2 desc, col3;

ここで、Aデシベル<>フィドルです。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=5828&siteId=1