如何将一个表与另一个表连接起来,然后计算非空列并将它们按其他两个字段分组?

问题描述

(我在添加表格时遇到了一些问题,因为它们被视为代码。已添加标签作为代码以包含它)

我有一个包含很多列的表格(示例中只有几列)

col1 col2 col3 col4 col5
2021.06 87 987 987 87
2021.06 86 09 65
2021.06 09 65
2021.06 09
2021.05 85 09 65
2021.05 85 09
2021.05 87 09

我还有第二个表,其中包含与上表中的 ID 编号相关的附加信息:

id 分支 信息1 信息2
85 branch1 test4 test5
86 branch1 test3
87 branch2 测试2
987 测试1
09 branch3 测试1
65 branch1 测试1

我需要找到一个简单的方法加入信息,统计非空列的数量并按月份和分支进行分组。结果应该是这样的

分支 col1 col2 col3 col4 col5
2021.05 branch1 2 0 0 0 1
2021.05 branch2 1 0 0 0 0
2021.05 branch3 0 0 0 3 0
2021.06 branch1 0 1 0 0 2
2021.06 branch2 0 1 0 0 1
2021.06 branch3 0 0 0 3 0
2021.06 0 0 1 1 0

我尝试过 join 和 union all,但查询变得非常大。

解决方法

考虑以下方法

select * from (
  select month,branch,id,col
  from table1 
  unpivot (id for col in (col1,col2,col3,col4,col5))
  left join table2 using(id)
)
pivot (count(id) for col in ('col1','col2','col3','col4','col5'))
# order by month,branch nulls last     

如果应用于您问题中的样本数据 - 输出为

enter image description here