我想基于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。类似地,当我尝试删除报价编号的条件并尝试运行查询时,它会给我具有最新交易记录的报价编号的值。
我想使用子查询并进行自我联接以获得正确的结果,但是我无法弄清楚。
答案 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的集合,具有正确事务类型的策略行的集合,等等。