使用FROM中的子查询而不是WHERE - SAP BO Web Intelligence

问题描述 投票:0回答:1

我正在尝试使用WebI查询构建器来实现我已经可以实现编写纯SQL查询的功能。

要求:计算特定组花费超过某个任意时间限制的故障单的百分比,以将故障单转移到与通过该组的所有故障单相关的任何第二个线路组。

为了实现这一点,我从审计表中选择特定行,并使用T-SQL LAG()函数获取上一次组更改的时间(为此,已经在Universe中有一个对象)。由于LAG()如何工作,我选择所有组更改行(和创建条目)作为中间结果,以便能够计算票据在任何组中所处的时间(ticket = '...'只是为了限制执行开发期间):

SELECT 
    ticket,
    change_date,
    LAG(change_date) OVER (PARTITION BY ticket ORDER BY change_date) 'change_date_prev',
    CASE
        WHEN LAG(change_date) OVER (PARTITION BY ticket ORDER BY change_date) IS NULL THEN 0
        ELSE change_date-LAG(change_date) OVER (PARTITION BY ticket ORDER BY change_date)
    END AS duration,
    group_before,
    group_after
FROM audit_log
WHERE 
    ticket = 'cr:2792293'
    AND (
        aud_opr = 'create'
        OR changed_attr ='group'
    )

结果是这样的:

ticket      change_date  change_date_prev  duration     group_before  group_after
------      -----------  ----------------  --------     ------------  -----------
cr:2792293  1554802730   NULL              0
cr:2792293  1554802808   1554802730        78           SUP-GroupA    OtherGroupA
cr:2792293  1554805870   1554802808        3062         OtherGroupA   OtherGroupB
cr:2792293  1554806322   1554805870        452          OtherGroupB   OtherGroupC
cr:2792293  1555319896   1554806322        513574       OtherGroupC   SUP-GroupA
cr:2792293  1555341997   1555319896        22101        SUP-GroupA    OtherGroupA
cr:2792293  1555343530   1555341997        1533         OtherGroupA   SUP-GroupA
cr:2792293  1555343625   1555343530        95           SUP-GroupA    SUP-GroupB
cr:2792293  1555344681   1555343625        1056         SUP-GroupB    OtherGroupA
cr:2792293  1555346162   1555344681        1481         OtherGroupA   SUP-GroupA
cr:2792293  1555346629   1555346162        467          SUP-GroupA    OtherGroupB
cr:2792293  1555346961   1555346629        332          OtherGroupB   OtherGroupC
cr:2792293  1555417764   1555346961        70803        OtherGroupC   SUP-GroupA
cr:2792293  1555419234   1555417764        1470         SUP-GroupA    SUP-GroupC
cr:2792293  1555424241   1555419234        5007         SUP-GroupC    SUP-GroupA
cr:2792293  1555513936   1555424241        89695        SUP-GroupA    SUP-GroupC

现在,我需要优化这个结果集给我两个数字:

  1. group_before是SUP-GroupA的门票数量。在纯SQL上,我会使用基本查询作为FROM部分的子查询,这样(需要报表可视化的其余列)然后只需对报表上的票证进行计数:
SELECT
    *
FROM ( <base query> ) AS transfers
WHERE
    transfers.group_before = 'SUP-GroupA'
  1. group_before是SUP-GroupA的票数,group_after是其他一些SUP- *组,持续时间大于某个任意值(再次,留下报告的计数):
SELECT
    *
FROM ( <base query> ) AS transfers
WHERE
    transfers.group_before = 'SUP-GroupA'
    AND transfers.group_after LIKE 'SUP-%'
    AND transfers.duration > 1234

这些查询在针对数据库执行时非常有效,但无论我在Web Intelligence和Universe上尝试什么样的魔法,我都无法使查询构建器生成类似的查询。我所知道的WebI的子查询功能都在WHERE子句上进行子查询,但这对我不起作用,因为LAG()函数对返回结果集的行起作用,所以如果我对它们进行过滤一个平面查询change_date_prev将从前一个返回的行获取change_date,而不是从之前的组更改。

我知道通过在查询构建器的查询脚本查看器中手动编写查询有一种肮脏的方法,但是我试图避免像瘟疫一样,因为如果有人甚至会在以后查看查询构建器时覆盖手动查询。

我是否达到了Web Intelligence的极限,或者在没有对宇宙中的大量一次性对象进行硬编码的情况下解决这个问题?

business-objects
1个回答
0
投票

我确定你已经想到了这一点,但为什么不在报告中做那些计算呢?您可以按原样保留查询,然后使用过滤器和变量来获取最终结果。

如果这不可行,那么我认为唯一的另一种选择是在Universe中创建派生表。您必须在GROUP BY(以及可能在条件中使用的任何其他字段)上添加ticket,以保持LAG正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.