Sql 如何在另一个查询中将计算列的总数用作值?

Sql 如何在另一个查询中将计算列的总数用作值?,sql,Sql,背景:- 我有一个场景,我想了解我们在被指定为首选供应商的项目中所报项目的价值,以及我们没有被指定的项目的价值 我可以使用的表格是dba.lead->dba.a 决定是否指定项目的列包括: “dba”“a”“altlineref”“如果altlineref=0,则不命名我们,如果altlineref=1,则命名我们。但是,每组项目中只有第一行包含1或0。其余为空 范例 "leadno" "lead_desc" "lineno" "calc_value"

背景:- 我有一个场景,我想了解我们在被指定为首选供应商的项目中所报项目的价值,以及我们没有被指定的项目的价值

我可以使用的表格是dba.lead->dba.a 决定是否指定项目的列包括: “dba”“a”“altlineref”“如果altlineref=0,则不命名我们,如果altlineref=1,则命名我们。但是,每组项目中只有第一行包含1或0。其余为空

范例

        "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
正如您可能知道的,我在这里有点深奥,非常感谢您的帮助-如果有人对如何将指定值和非指定值分开有更好的建议,请包括在内

非常感谢


Phil

您的情况是,您的报价行上定义了
altlineref
calc_groupingref
。多行可能具有相同值的
calc\u groupingref
,但只有一行具有正确的
altlineref
(所有其他行都具有
NULL
值)

下面是另一种表述查询的方法。内部查询只是按lead和
calc\u groupingref
聚合报价行。在这样做时,它会找到最大值和值之和。然后,外部查询将此信息与
潜在客户

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;

在此过程中,我引入了表别名以使查询更容易理解。

您的情况是,您的报价行上定义了
altlineref
calc\u groupingref
。多行可能具有相同值的
calc\u groupingref
,但只有一行具有正确的
altlineref
(所有其他行都具有
NULL
值)

下面是另一种表述查询的方法。内部查询只是按lead和
calc\u groupingref
聚合报价行。在这样做时,它会找到最大值和值之和。然后,外部查询将此信息与
潜在客户

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;

在此过程中,我引入了表别名以使查询更容易理解。

在连接两个表之前,我会在子查询中将
altlineref
替换为
MAX(altlineref)OVER(partitionbycalc\u 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
;

在连接这两个表之前,我会在子查询中将
altlineref
替换为
MAX(altlineref)OVER(partitionbycalc\u 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
;

你试过使用COUNT()函数吗?我在哪里使用这个函数?我已经使用了大多数函数来尝试解决这个问题。我的主要问题是,当我尝试在(由“dba”、“a”、“a”、“a”、“altlineref”划分的“a”、“a”、“a”、“calc”groupingref”)上进行求和(MAX(“dba”、“a”、“a”、“a”、“altlineref”)时,它不起作用。您是否尝试过使用COUNT()函数?我将在哪里使用该函数?我已经使用了大多数函数来尝试解决这个问题。我的主要问题是,当我尝试在(由“dba”、“a”、“a”、“altlineref”划分的分区上)进行求和(MAX(“dba”、“a”、“a”、“a”、“calc”groupingref”))时,它不起作用。这几乎是完美的,但我对它进行了一点测试,一些结果被认为是错误的,例如,我测试了一个总值为49885的报价,但它提供给我的指定和非指定数字分别为46608 Spec和6394 non Spec-当两个数字加起来超过总报价值时,查询是否可能重复值?-另外,作为旁注,列出的两个数字似乎是错误的,在本例中,较大的值应分配给非规范列…@PhilSlade。我想不出有什么办法可以增加总价值。如果可以的话,你能用这个例子的数据编辑这个问题吗?戈登,谢谢你花时间来帮助我。在运行Andiry M给出的答案并得到与您相同的结果后,很明显我的数据集出了问题,经过一些挖掘后,我确实解决了这个问题。上面的代码工作得很好。再次感谢!!我没有首先尝试分析你的解决方案,因为Phil对错误结果的最初评论,也因为我有自己的想法可以建议。直到现在,当我想到提出一个支点解决方案时,我才意识到支点就是你的答案。我的意思是,main SELECT的聚合在当时看起来确实像是一个正常的旋转过程,但我有疑问,因为
maxref
是如何获得的。(正如我所说,我没有仔细调查。)所以,干得好,并且+1!这几乎是完美的,但是我已经测试了一点,有些结果是错误的,例如,我测试了一个总值为49885的报价,但它提供给我的指定和非指定数字分别为46608 Spec和6394 non Spec-当两个数字加起来超过总报价值时,查询是否可能重复值?-另外,作为旁注,列出的两个数字似乎是错误的,应将较大的值指定给此表中的非规格列