将总值的部分计为每行的列数(数据透视表)

时间:2012-10-10 19:40:19

标签: sql oracle oracle11g pivot-table

我遇到了一个看似简单的查询,但无法让它在最后几个小时运行。

我有一个表files,它保存文件名和一些值,例如此文件中的记录,创建日期(create_date),处理日期(processing_date)等等。在不同的时间内创建日期可能有多个文件,很可能它们不会在创建的同一天进行处理,实际上甚至可能需要三天或更长时间来处理它们。

所以我们假设我有这些行,例如:

create_date            | processing_date
------------------------------
2012-09-10 11:10:55.0  | 2012-09-11 18:00:18.0
2012-09-10 15:20:18.0  | 2012-09-11 13:38:19.0
2012-09-10 19:30:48.0  | 2012-09-12 10:59:00.0
2012-09-11 08:19:11.0  | 2012-09-11 18:14:44.0
2012-09-11 22:31:42.0  | 2012-09-21 03:51:09.0

我希望在单个查询中是将分组列截断到create_date天,另外还有11列用于processing_date和{{之间的差异1}},所以结果应该大致如下:

create_date

依此类推,我希望你明白这一点:)

我已经尝试了这一点,到目前为止,它可以为create_date | diff0days | diff1days | diff2days | ... | diff10days ------------------------------------------------------------------------ 2012-09-10 | 0 2 1 ... 0 2012-09-11 | 1 0 0 ... 1 获取单个聚合列,但差异为 - 例如 - 3:

create_date

我尝试组合单个查询并尝试了子查询,但这没有帮助,或者至少我对SQL的了解还不够。

我需要的是一个提示,以便我可以将各种差异包括在列中,如上所示。 我怎么可能实现这个目标?

2 个答案:

答案 0 :(得分:2)

这基本上是一个转轴问题:

SELECT  TRUNC(f.create_date, 'DD') as created
,       sum(case TRUNC(f.process_date, 'DD') - trunc(f.create_date, 'DD')
                  when 0 then 1 end) as diff0days   
,       sum(case TRUNC(f.process_date, 'DD') - trunc(f.create_date, 'DD')
                  when 1 then 1 end) as diff1days   
,       sum(case TRUNC(f.process_date, 'DD') - trunc(f.create_date, 'DD')
                  when 2 then 1 end) as diff2days   
,       ...
FROM    files f 
GROUP BY 
        TRUNC(f.create_date, 'DD')

答案 1 :(得分:1)

SELECT CreateDate,
    sum(CASE WHEN DateDiff(day, CreateDate, ProcessDate) = 1 THEN 1 ELSE 0 END) AS Diff1,
    sum(CASE WHEN DateDiff(day, CreateDate, ProcessDate) = 2 THEN 1 ELSE 0 END) AS Diff2,
    ...
FROM table
GROUP BY CreateDate
ORDER BY CreateDate