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

fafcakar  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(299)

我想计算表中所有报价编号的报价保费总和,其中最新的交易基于trans\u id。下面的查询适用于单个报价编号,其中order by transaction\u id desc limit 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的值。类似地,当我尝试删除quote number的条件并尝试运行查询时,它会给我一个具有最新事务记录的某个quote number的值。
我想使用子查询并进行自连接以获得正确的结果,但我无法理解。

wydwbb8l

wydwbb8l1#

你需要一个只考虑最高值的结果集 Trans_id 对于每个 quote_no . 这就是你最近的意思。从子查询开始获取 Trans_id 价值观。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的集合,具有正确事务类型的策略行的集合,等等。

相关问题