1

背景 :- 優先サプライヤーとして指名されたプロジェクトで見積もったアイテムの価値と、指名されていないアイテムの価値を知りたいシナリオがあります。

私が自由に使えるテーブルは 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

あなたはおそらく私がここで私の深さから少し離れていることを知っているので、どんな助けも大歓迎です-そして、指定された値と指定されていない値を分割する方法について誰かがより良い提案を持っているなら、それを含めてください.

よろしくお願いします

フィル

4

2 に答える 2

1

あなたの状況は、見積品目があり、それらaltlinerefcalc_groupingref定義されているということです。複数の行がcalc_groupingref同じ値を持つ場合がありますが、正しい値を持つのは 1 つだけです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;

途中で、クエリを理解しやすくするためにテーブル エイリアスを導入しました。

于 2013-08-07T16:19:42.103 に答える
0

2 つのテーブルを結合する前に、この行セットの代わりに次のようにサブクエリで置き換え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、null が結果を混乱させることを恐れることなく、外側のクエリで簡単に参照できるようになります。

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
;
于 2013-08-07T19:20:00.960 に答える