Вам нужен набор результатов, учитывающий только самое высокое Trans_id
для каждого quote_no
.Это то, что вы подразумеваете под последним. Начните с подзапроса, чтобы получить эти Trans_id
значения. Просмотр в БД 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
Совет Pro : SQL декларативный, а не процедурный.Это язык для объявления того, какие наборы данных вам нужны из ваших таблиц.Таким образом, при разработке этого материала подумайте о наборах: набор последних идентификаторов транзакций, набор строк политики с правильными типами транзакций и т. Д.