Sql 如何避免列组织数据处理和行组织数据处理之间的转换

Sql 如何避免列组织数据处理和行组织数据处理之间的转换,sql,db2,query-optimization,Sql,Db2,Query Optimization,我正在使用列组织的表开发DB2BLU 我的数据集如下所示: Day month year value ------- ------- 20200101 202001 2020 100 20200102 202001 2020 110 ... 20200215 202002 2020 120 我希望按周、月和年汇总此结果: Id value 2020 12000 202001 4000 'january 202002 4000 'february 2020001 700 'first week

我正在使用列组织的表开发DB2BLU

我的数据集如下所示:

Day month year value
------- -------
20200101 202001 2020 100
20200102 202001 2020 110
...
20200215 202002 2020 120
我希望按周、月和年汇总此结果:

Id value
2020 12000
202001 4000 'january
202002 4000 'february
2020001 700 'first week of 2020
为了做到这一点,我还有表d_tps

Type Id week month year
J 20200101 2020001 202001 2020
J 20200102 2020001 202001 2020
...

J 20200215 2020007 202002 2020
M 202001 null 202001 2020
M 202002 null 202002 2020
Y 2020 null null 2020

我的方法如下

select d.id, sum(value) from tab1
Inner join d_tps d
On d.id = tab1.year
Or d.id = tab1.month
Or d.id = tab1.year
group by d.id
它工作并返回预期结果。不幸的是,在查询计划中,join with OR条件会导致CTQ操作符提前出现,并且大多数查询(实际上更复杂)被视为行而不是列


如何对其进行优化?

看起来,一个
连接
条件以及聚合就足够了:

select d.week, sum(value)
from tab1 Inner join
     d_tps d
     On d.id = tab1.day
group by d.week
如果要按多个时间级别进行聚合,请使用分组集:

select d.week, d.month, d.year, sum(value)
from tab1 Inner join
     d_tps d
     On d.id = tab1.day
group by grouping sets ((d.week), (d.month), (d.year))

您应该使用
groupbygroupingset
&
GROUPING
功能来实现您想要的功能

WITH T (day, month, year, value) AS 
(
values 
  (20200101, 202001, 2020, 100)
, (20200102, 202001, 2020, 110)
, (20200215, 202002, 2020, 120)
)
SELECT 
CASE 
  WHEN GROUPING(DAY)   = 0 THEN DAY
  WHEN GROUPING(MONTH) = 0 THEN MONTH
  WHEN GROUPING(YEAR ) = 0 THEN YEAR
END AS ID
, SUM(VALUE) AS VALUE
FROM T
GROUP BY GROUPING SETS (DAY, MONTH, YEAR);
结果是:

|ID         |VALUE      |
|-----------|-----------|
|2020       |330        |
|202001     |210        |
|202002     |120        |
|20200101   |100        |
|20200102   |110        |
|20200215   |120        |

联合所有单独的周/月/年选择?只有一周需要加入。Tab1实际上是一个子查询,所以我想避免联合,因为性能是可读的。我不知道分组集。我明天会试试。关键字不见了:
按分组集分组((d.week),(d.month),(d.year))
关键字确实不见了。否则,它的工作完全符合预期和需要,谢谢@没有。非常感谢。