如何在另一个查询中使用总计计算列作为值?

时间:2013-08-07 15:32:40

标签: sql

背景: - 我有一个场景,我想知道我们在已被命名为首选供应商的项目中引用的项目的价值,以及我们未命名的项目的价值。

我可以使用的表格是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

你可能已经意识到我在这里有点偏离,任何帮助都会受到大力赞赏 - 如果有人对如何拆分指定值和非指定值有更好的建议,请加入。

非常感谢提前

菲尔

2 个答案:

答案 0 :(得分:1)

您的情况是您的报价行已定义altlinerefcalc_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
;