使用子查询的报价溢价之和

时间:2018-10-19 18:55:15

标签: mysql pivot mysql-workbench

我想基于trans_id计算表中存在的所有最新报价的报价溢价之和。以下查询适用于单引号,其中Transaction_id DESC限制为1的订单提供最高的交易记录。

SELECT  SUM(quoted_premium)  FROM policy 
     Where  quote_no= '1010'
     AND trans_type IN ('quote1','new', 'quote2')
     group by quote_no,Trans_id
     ORDER BY Trans_id DESC LIMIT 1;

由于数据是机密的,因此我将提供一个示例表。报价相同但没有交易ID的记录有多个。我需要获取最近记录的一堆交易ID的总和。上面的查询对一个引用号有效,但对所有和都不适用。

Trans_id    quote_no    trans_type  quoted premium  
1              1011         quote2      0   
1              1010         quote2      0   
2              1010         quote2     -16  
2              1010         quote2     -19  
2              1010         quote2     -51  
2              1010         quote2     776  
2              1010         quote2      0   
2              1010         quote2     381  
2              1010         quote2      0   
2              1010         quote2      0   
2              1010         quote2      59  
2              1010         quote2      0   
2              1010         quote2      0   
2              1010         quote2      9   
2              1010         quote2     194  
2              1010         quote2      0   
3              1010         quote2      0   
3              1010         quote2      0   
3              1010         quote2      1   
.               .             .         .
.               .             .         .
.               .             .         .

我需要将上面的记录与下面的csv文件进行匹配。 csv文件中存在的记录总数为39731

QUOTE_NO  New   Quote1   Quote2     GrandSum
1009     1425     -         -        1,425   
1010       -      0        556         556
1111       -      0       1,332      1,332       
.          .      .         .           .
.          .      .         .           .
                             sum     54,138,664
                             Avg     1363

因此,当我使用上述查询来计算报价编号:1010的报价溢价之和时,它的值为556。类似地,当我尝试删除报价编号的条件并尝试运行查询时,它会给我具有最新交易记录的报价编号的值。

我想使用子查询并进行自我联接以获得正确的结果,但是我无法弄清楚。

1 个答案:

答案 0 :(得分:1)

您需要一个结果集,仅考虑每个Trans_id中最高的quote_no。这就是最新的意思。从子查询开始,获取那些Trans_id值。  View on DB Fiddle

SELECT quote_no, MAX(Trans_id) Trans_id
  FROM policy
 GROUP BY quote_no;

| quote_no | Trans_id |
| -------- | -------- |
| 1010     | 3        |
| 1011     | 1        |

接下来,您应该编写一个查询来获取GrandSum值,以说服自己您已正确进行了过滤。

SELECT p.quote_no, SUM(p.quoted_premium) GrandSum
  FROM policy p
  JOIN (
             SELECT quote_no, MAX(Trans_id) Trans_id
              FROM policy
             GROUP BY quote_no
       ) sel ON p.quote_no = sel.quote_no AND p.Trans_id = sel.Trans_id
  WHERE trans_type IN ('quote1','new', 'quote2')
  GROUP BY p.quote_no

(问题中的样本数据在此处给出的结果集并不十分有趣,因为您最高的Trans_id值适用于无聊的记录。)

最后,修改该查询以进行演示。您的演示涉及对每个trans_type的行进行透视,因此它们显示为列。可以通过SUM(IF...模式完成。

SELECT p.quote_no, 
       SUM(IF(p.trans_type = 'new', p.quoted_premium, 0)) new,
       SUM(IF(p.trans_type = 'quote1', p.quoted_premium, 0)) quote1,
       SUM(IF(p.trans_type = 'quote2', p.quoted_premium, 0)) quote2,
       SUM(p.quoted_premium) GrandSum
  FROM policy p
  JOIN (
             SELECT quote_no, MAX(Trans_id) Trans_id
              FROM policy
             GROUP BY quote_no
       ) sel ON p.quote_no = sel.quote_no AND p.Trans_id = sel.Trans_id
  WHERE trans_type IN ('quote1','new', 'quote2')
  GROUP BY p.quote_no

专业提示:SQL是声明性的,不是过程性的。这是一种用于声明表中需要哪些数据集的语言。因此,在设计这些东西时,请考虑集合:最新的事务ID的集合,具有正确事务类型的策略行的集合,等等。