Сумма котируемой премии с использованием подзапроса - PullRequest
0 голосов
/ 19 октября 2018

Я хочу рассчитать сумму котируемой премии для всех номеров котировок, представленных в таблице, с последней транзакцией на основе trans_id.Приведенный ниже запрос работает для одного номера кавычки, где порядок по предельному значению DESC Transaction_id дает наибольшую запись транзакции.

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;

Поскольку данные являются конфиденциальными, я приведу образец таблицы.Есть несколько записей для одной и той же цитаты, но разные идентификаторы транзакций.Мне нужно получить сумму группы транзакций с последними записями.Приведенный выше запрос прекрасно работает для одного числа в кавычках, но не для суммы всех.

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 голосов
/ 20 октября 2018

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

...