背景: - 我有一个场景,我想知道我们在已被命名为首选供应商的项目中引用的项目的价值,以及我们未命名的项目的价值。
我可以使用的表格是dba.lead - > dba.a_quotelne 决定是否指定项目的列是: " DBA"" a_quotelne"" altlineref"如果altlineref = 0,那么我们没有命名,如果它= 1我们已被命名。但是,只有每组项目的第一行包含1或0.其余的都是Null。
实施例
"leadno" "lead_desc" "lineno" "calc_value" "altlineref" "calc_groupingref"
1 Canary Wharf 1 10 0 1000
1 Canary Wharf 2 16 Null 1000
1 Canary Wharf 3 12 Null 1000
1 Canary Wharf 4 12 1 1001
1 Canary Wharf 5 13 Null 1001
2 Rosente Lane 1 14 0 1002
2 Rosente Lane 2 14 1 1003
2 Rosente Lane 3 12 Null 1003
2 Rosente Lane 1 15 1 1004
2 Rosente Lane 2 267 Null 1004
2 Rosente Lane 3 298 Null 1004
然后,我使用以下代码将指定值和非指定值分开,但我现在需要总计每个,然后以某种方式仅在更大的报告中使用计算的总数。
SELECT "dba"."lead"."leadno",
"dba"."lead"."lead_desc",
"dba"."a_quotelne"."quoteno",
"dba"."a_quotelne"."lineno",
"dba"."a_quotelne"."calc_value" * MAX("dba"."a_quotelne"."altlineref") OVER (PARTITION BY "dba"."a_quotelne"."calc_groupingref") AS SPEC_VALUE,
"dba"."a_quotelne"."calc_value" - SPEC_VALUE AS NONSPEC_VALUE
FROM "dba"."a_quotelne",
"dba"."lead"
WHERE ( "dba"."a_quotelne"."leadno" = "dba"."lead"."leadno" )
GROUP BY "dba"."a_quotelne"."altlineref",
"dba"."a_quotelne"."calc_groupingref",
"dba"."a_quotelne"."calc_value",
"dba"."a_quotelne"."quoteno",
"dba"."lead"."lead_desc",
"dba"."lead"."leadno",
"dba"."a_quotelne"."lineno"
我希望实现的结果如下
"leadno" "lead_desc" Nonspec value Spec value
1 Canary Wharf 38 25
2 Rosente Lane 14 606
你可能已经意识到我在这里有点偏离,任何帮助都会受到大力赞赏 - 如果有人对如何拆分指定值和非指定值有更好的建议,请加入。
非常感谢提前
菲尔
答案 0 :(得分:1)
您的情况是您的报价行已定义altlineref
和calc_groupingref
。多行可能calc_groupingref
具有相同的值,但只有一行的值为altlineref
(其他所有值都为NULL
)。
以下是制定查询的另一种方法。内部查询只是按引导和calc_groupingref
聚合引用行。在这样做时,它会找到最大值和值的总和。外部查询然后将此信息与lead
:
select l.leadno, l.lead_desc,
sum(case when maxref = 0 then ql.val end) as NONSPEC_VALUE,
sum(case when maxref = 1 then ql.val end) as SPEC_VALUE
from dba.lead l join
(SELECT ql.leadno, sum(ql.calc_value) as val,
MAX(ql.altlineref) as maxref
FROM dba.a_quotelne ql
group by ql.leadno, cal_groupingref
) ql
on ql.leadno = l.leadno
GROUP BY l.leadno, l.lead_desc;
在此过程中,我引入了表别名以使查询更易于理解。
答案 1 :(得分:0)
在加入这两个表之前,我会在子查询中用altlineref
替换MAX(altlineref) OVER (PARTITION BY calc_groupingref)
,以便代替此行设置:
altlineref calc_groupingref
---------- ----------------
0 1000
Null 1000
Null 1000
1 1001
Null 1001
0 1002
1 1003
Null 1003
1 1004
Null 1004
Null 1004
我会加入这个:
altlineref calc_groupingref
---------- ----------------
0 1000
0 1000
0 1000
1 1001
1 1001
0 1002
1 1003
1 1003
1 1004
1 1004
1 1004
这样我就可以在外部查询中轻松引用altlineref
,而不必担心空值会让我的结果变得混乱:
SELECT
l.leadno,
l.lead_desc,
nonspec_value = SUM(q.calc_value * (1 - q.altlineref)),
spec_value = SUM(q.calc_value * q.altlineref )
FROM dba.lead AS l
INNER JOIN (
SELECT
leadno,
altlineref = MAX(altlineref) OVER (PARTITION BY calc_groupingref),
calc_value
FROM dba.a_quotelne
) AS q ON l.leadno = q.leadno
GROUP BY
l.leadno,
l.lead_desc
;