在 FROM 而不是 WHERE 中使用子查询 - SAP BO Web Intelligence
Using sub-query in FROM instead of WHERE - SAP BO Web Intelligence
我正在尝试使用 WebI 查询生成器来实现一些我已经可以编写纯 SQL 查询的东西。
要求:计算特定组花费超过某个任意时间限制将票转移到任何第二线组的工单相对于通过该组的所有工单的百分比。
为了实现这一点,我从审计中选择特定的行 table 并使用 T-SQL LAG() 函数来获取上一个组更改的时间(已经有一个对象在宇宙为此)。由于 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
现在,我需要优化此结果集以提供两个数字:
group_before
是 SUP-GroupA 的票数。在纯 SQL 上,我会像这样使用基本查询作为 FROM 部分的子查询(需要其余列用于报告可视化),然后只对报告中的票进行计数:
SELECT
*
FROM ( <base query> ) AS transfers
WHERE
transfers.group_before = 'SUP-GroupA'
- 票数,其中
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 的极限,或者是否有解决这个问题的方法,而无需对 Universe 中的大量一次性对象进行硬编码?
我相信您已经想到了这一点,但为什么不直接在报告中进行这些计算呢?您可以保持查询不变,然后使用过滤器和变量来获得最终结果。
如果那不可行,那么我认为唯一的其他选择是在宇宙中创建一个派生的 table。您必须在 ticket
(以及可能在条件中使用的任何其他字段)上添加 GROUP BY
,以保持 LAG 正常工作。
我正在尝试使用 WebI 查询生成器来实现一些我已经可以编写纯 SQL 查询的东西。
要求:计算特定组花费超过某个任意时间限制将票转移到任何第二线组的工单相对于通过该组的所有工单的百分比。
为了实现这一点,我从审计中选择特定的行 table 并使用 T-SQL LAG() 函数来获取上一个组更改的时间(已经有一个对象在宇宙为此)。由于 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
现在,我需要优化此结果集以提供两个数字:
group_before
是 SUP-GroupA 的票数。在纯 SQL 上,我会像这样使用基本查询作为 FROM 部分的子查询(需要其余列用于报告可视化),然后只对报告中的票进行计数:
SELECT
*
FROM ( <base query> ) AS transfers
WHERE
transfers.group_before = 'SUP-GroupA'
- 票数,其中
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 的极限,或者是否有解决这个问题的方法,而无需对 Universe 中的大量一次性对象进行硬编码?
我相信您已经想到了这一点,但为什么不直接在报告中进行这些计算呢?您可以保持查询不变,然后使用过滤器和变量来获得最终结果。
如果那不可行,那么我认为唯一的其他选择是在宇宙中创建一个派生的 table。您必须在 ticket
(以及可能在条件中使用的任何其他字段)上添加 GROUP BY
,以保持 LAG 正常工作。