DB2 SQL可以在没有间隙的情况下聚合数月的值

DB2 SQL可以在没有间隙的情况下聚合数月的值,db2,Db2,我有两个表,需要对它们进行连接,还有一个表是使用with内联生成的。WITH是一个日期范围,我需要显示1个表中所有月份的所有行,即使第2个表中没有数据 这是表中的数据: 表转诊分组 referral_group -------------- VER FRD FCC referral_group | task_date | task_id | over_threshold ---------------+------------+---------+--------------- VER

我有两个表,需要对它们进行连接,还有一个表是使用with内联生成的。WITH是一个日期范围,我需要显示1个表中所有月份的所有行,即使第2个表中没有数据

这是表中的数据:

转诊分组

referral_group
--------------
VER
FRD
FCC
referral_group | task_date  | task_id | over_threshold
---------------+------------+---------+---------------
VER            | 2015-10-01 |      10 |              0
FRD            | 2015-11-04 |      20 |              1
数据值

referral_group
--------------
VER
FRD
FCC
referral_group | task_date  | task_id | over_threshold
---------------+------------+---------+---------------
VER            | 2015-10-01 |      10 |              0
FRD            | 2015-11-04 |      20 |              1
日期范围需要选择3个月:

  • 2015年10月
  • 2015年11月
  • 2015年12月
我希望最终得到的数据是:

MonthYear | referral_group | count_of_group | total_over_threshold
----------+----------------+----------------+---------------------
Oct-2015  | VER            |              1 |                    0
Oct-2015  | FRD            |              0 |                    0
Oct-2015  | FCC            |              0 |                    0
Nov-2015  | VER            |              0 |                    0
Nov-2015  | FRD            |              1 |                    1
Nov-2015  | FCC            |              0 |                    0
Dec-2015  | VER            |              0 |                    0
Dec-2015  | FRD            |              0 |                    0
Dec-2015  | FCC            |              0 |                    0
创建2个表并填充数据的DDL如下所示

CREATE TABLE test_data (
referral_group char(3),
task_date date,
task_id integer,
over_threshold integer);
insert into test_data values
('VER','2015-10-01',10,1),
('FRD','2015-11-04',20,0);

CREATE TABLE referral_grouper (
referral_group char(3));
insert into referral_grouper values
('FRD'),
('VER'),
('FCC');
这是一个非常精简的示例,在这个示例中使用了最小的表/列,这就是我没有主键/索引的原因

我可以让它在LUW下运行,没有问题,按照这个SQL使用连接中的notexists

WITH DATERANGE(FROM_DTE,yyyymm, TO_DTE) AS
(
  SELECT DATE('2015-10-01'), YEAR('2015-10-01')*100+MONTH('2015-10-01'), '2015-12-31'
    FROM SYSIBM.SYSDUMMY1
  UNION ALL
    SELECT FROM_DTE + 1 DAY, YEAR(FROM_DTE+1 DAY)*100+MONTH(FROM_DTE+1 DAY), TO_DTE
    FROM DATERANGE
    WHERE FROM_DTE < TO_DTE
)
select
  referral_grouper.referral_group,
  daterange.yyyymm,
  count(test_data.task_id) AS total_count,
  COALESCE(SUM(over_threshold),0) AS total_over_threshold
FROM
  test_data
  RIGHT OUTER JOIN daterange ON (daterange.from_dte=test_data.task_date OR NOT EXISTS (SELECT 1 FROM daterange d2 WHERE d2.from_dte=test_data.task_date))
  RIGHT OUTER JOIN referral_grouper ON (referral_grouper.referral_group=test_data.referral_group OR NOT EXISTS (SELECT 1 FROM referral_grouper g2 WHERE g2.referral_group=test_data.referral_group))
GROUP BY
  referral_grouper.referral_group,
  daterange.yyyymm
然而。。。这需要在ZOS上工作,并且在ZOS下,您不能将子查询用于联接中的EXISTS。删除“不存在”表示不再显示不存在的行


必须有一种方法来编写SQL以返回2个链接表中的所有行,而不使用notexists,但我似乎找不到它。如果您在这方面有任何帮助,我将不胜感激,因为这让我感到困惑

我认为您根本不需要那些
不存在的
,因为您使用的是外部联接。我已经尝试过了,但结果非常不可预测。它错过了一些不存在数据的月份,并且还有带有null monthname/yyyymm的记录。好的,我让它工作了。我从daterange中删除了Ort NOT EXISTS,并将grouper上的连接更改为普通的[内部]连接。在ZOS下,这允许notexists子查询,它似乎可以工作,并且数据是正确的。为什么这样做有效而没有正确的外部联接而不存在是一个问题mystery@jimnz111-你可以回答你自己的问题,你知道。为了避免麻烦,您通常应该从“始终”(几乎)存在的表引用中创建
,在这种情况下可能是
daterange
,然后获得可选连接(如果有),通常是通过
左连接。哦,我真的建议创建一个永久的日历文件,这是一个大大扩展的版本,具有各种可连接/可搜索的优点。