Oracle SQL 多列与单个范围/图例对齐

Posted

技术标签:

【中文标题】Oracle SQL 多列与单个范围/图例对齐【英文标题】:Oracle SQL multiple columns aligned to a single range/legend 【发布时间】:2015-02-21 22:17:41 【问题描述】:

我的应用程序中有一个活动表。它有一个项目 ID、一个活动 ID、一个基线完成日期、一个实际完成日期、一个计划完成日期和一个延迟完成日期。

我想在每个日期列中计算项目每周的活动 ID。然后我想获取这些日期列中的每一个并将它们相互绘制。

最终结果将是一条曲线,显示第 2 周的活动数量与第 2 周的实际活动数量、第 2 周计划的活动数量以及第 2 周迟到的活动数量的比较.

我可以这样做以显示数据...

SELECT ACTIVITY.PROJECTOBJECTID,
       ACTIVITY.OBJECTID,
       TRUNC(ACTIVITY.BASELINEFINISHDATE,'W')+7 AS BLFIN,
       TRUNC(ACTIVITY.ACTUALFINISHDATE,'W')+7 AS AFIN,
       TRUNC(ACTIVITY.FINISHDATE,'W')+7 AS FIN,
       TRUNC(ACTIVITY.REMAININGLATEFINISHDATE,'W')+7 AS LFIN
  FROM PXRPTUSER.ACTIVITY ACTIVITY
 WHERE (ACTIVITY.PROJECTOBJECTID = :POID)

但是,现在我有四个日期列。理想情况下,我想要四个计数列和一个日期列。这是我必须处理的数据示例。

PID     AID     BLFIN     AFIN  FIN         LFIN
39987   5874494 2/22/2015       2/22/2015   6/15/2015
39987   5874495 2/22/2015       2/22/2015   6/15/2015
39987   5874496 2/22/2015       2/22/2015   6/15/2015
39987   5874497 2/22/2015       2/22/2015   6/15/2015
39987   5874498 2/22/2015       2/22/2015   6/15/2015
39987   5874499 4/22/2015       4/22/2015   6/15/2015
39987   5874500 2/22/2015       2/22/2015   6/15/2015
39987   5874501 2/22/2015       2/22/2015   6/15/2015
39987   5874502 4/8/2015        4/8/2015    6/15/2015
39987   5874503 4/8/2015        4/8/2015    6/15/2015
39987   5874504 4/8/2015        4/8/2015    6/15/2015
39987   5874505 5/15/2015       5/15/2015   6/15/2015
39987   5874506 5/15/2015       5/15/2015   6/15/2015
39987   5874507 4/8/2015        4/8/2015    6/15/2015
39987   5874508 4/8/2015        4/8/2015    6/15/2015
39987   5874509 4/8/2015        4/8/2015    6/15/2015
39987   5874510 4/8/2015        4/8/2015    6/15/2015
39987   5874511 4/8/2015        4/8/2015    6/15/2015
39987   5874512 4/8/2015        4/8/2015    6/15/2015
39987   5874513 4/8/2015        4/8/2015    6/15/2015
39987   5874514 4/8/2015        4/8/2015    6/15/2015
39987   5874515 4/8/2015        4/8/2015    6/15/2015
39987   5874516 4/8/2015        4/8/2015    6/15/2015
39987   5874517 4/8/2015        4/8/2015    6/15/2015
39987   5874537 2/22/2015       2/22/2015   6/15/2015
39987   5874538 2/22/2015       2/22/2015   6/15/2015
39987   5874539 2/22/2015       2/22/2015   6/15/2015
39987   5874540 2/22/2015       2/22/2015   2/22/2015
39987   5874542 2/22/2015       2/22/2015   6/15/2015
39987   5874543 2/22/2015       2/22/2015   6/15/2015
39987   5874544 2/22/2015       2/22/2015   6/15/2015
39987   5874545 2/22/2015       2/22/2015   6/15/2015
39987   5874546 2/22/2015       2/22/2015   6/15/2015
39987   5874547 2/22/2015       2/22/2015   6/15/2015
39987   5874548 2/22/2015       2/22/2015   6/15/2015
39987   5874549 2/22/2015       2/22/2015   6/15/2015
39987   5874550 2/22/2015       2/22/2015   6/15/2015
39987   5874551 2/22/2015       2/22/2015   6/15/2015
39987   5874552 2/22/2015       2/22/2015   6/15/2015
39987   5874553 2/22/2015       2/22/2015   6/15/2015
39987   5874554 2/22/2015       2/22/2015   6/15/2015

【问题讨论】:

【参考方案1】:

下面的查询给出了描述的结果。 WKN 列是week number in ISO standard,您可能希望将其更改为其他内容,例如。 'WW'。 此外,如果您有不同年份的日期,则必须在查询中连接年份(在 bf、af、pf 和 lf 子查询中将年份附加到 wkn)。

with 
bf as (select to_char(blfin, 'iw') wkn, count(aid) cnt 
  from activity group by to_char(blfin, 'iw')),
af as (select to_char(afin, 'iw') wkn, count(aid) cnt 
  from activity group by to_char(afin, 'iw')),
pf as (select to_char(fin, 'iw') wkn, count(aid) cnt 
  from activity group by to_char(fin, 'iw')),
lf as (select to_char(lfin, 'iw') wkn, count(aid) cnt 
  from activity group by to_char(lfin, 'iw'))
select wkn, nvl(bf.cnt, 0) as baseline, nvl(af.cnt, 0) as actual, 
    nvl(pf.cnt, 0) as planned, nvl(lf.cnt, 0) as late
  from bf
    full join af using (wkn)
    full join pf using (wkn)
    full join lf using (wkn)
  where wkn is not null
  order by wkn

结果:

  WKN BASELINE ACTUAL   PLANNED  LATE
  --- -------- -------- -------- --------
  08        24        0       24        1
  15        14        0       14        0
  17         1        0        1        0
  20         2        0        2        0
  25         0        0        0       40

【讨论】:

这太棒了!!它完全按照需要工作。当然,我做了一些外观上的改变。但是,我确实需要每行 WKN 列左侧的项目 ID。我可能会针对所有打开的项目运行此程序,然后将结果分组到单独的报告中。我尝试通过“使用 (wkn,pid) 完全加入 af”来更改完全加入语句,但它没有用。关于我如何到达那里的任何想法?非常感谢! 我成功了。我将项目 ID 添加到 WITH 部分的选择语句中。然后我将项目 ID 添加到 group by 子句中。然后我在 WKN 之前添加了项目 ID。然后我在完整连接中的 WKN 之前添加了 PID。快!非常感谢。 我很高兴它很有用。祝项目好运:-) 再补充一点:如果您以后提出问题,请附上一张带有预期结果的简短表格,这对回答的人很有帮助。 您可能想在此处阅读有关分析函数的更多信息 (docs.oracle.com/cd/E11882_01/server.112/e41084/…)。如果您有其他疑问、要求、愿望,请将它们作为单独的问题形成,因为本网站是以问答方式构建的,这不是论坛。我很乐意为您提供帮助,但这样您就有更好的机会获得更好更快的答案。

以上是关于Oracle SQL 多列与单个范围/图例对齐的主要内容,如果未能解决你的问题,请参考以下文章

SQL 按多列分组,但在子句中给出一个范围值

从跨越多列的名称范围编译不同值的列表

图例条目、范围、饼图、删除、条件

如何将seaborn图例拆分为多列?

DataFrame查询2 - 专用查询:索引和切片

SQL:一个表多列模糊查询