DB2 SQL几个月聚合值,没有间隙

时间:2016-01-06 23:26:57

标签: db2

我需要连接2个表,以及使用WITH生成内联的表。 WITH是一个日期范围,我需要显示所有月份的1个表中的所有行,即使第二个表中没有数据也是如此。

这是表格中的数据:

REFERRAL_GROUPINGS

referral_group
--------------
VER
FRD
FCC

DATA_VALUES

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

日期范围需要选择3个月:

  • OCT-2015
  • NOV-2015
  • DEC-2015

我期望得到的数据将是:

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

DDL创建2个表并填充数据如下。

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在连接中使用NOT EXISTS。

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的子查询。删除NOT EXISTS意味着不再显示不存在的行。

必须有一种方法可以编写SQL来返回2个链接表中的所有行,而不使用NOT EXISTS,但我似乎无法找到它。任何帮助都会非常感激,因为它让我难过

0 个答案:

没有答案