シン:
シナリオ:
以下は、私のテーブルです。
+-------+-----------+--------+--------+
|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デシベル<>フィドルです。