Что я должен сделать, чтобы распечатать желаемое значение результата sql присоединения? (SQL Только присоединиться к первому совпадению) - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть две таблицы:

Я хочу использовать значение chart_num для двух таблиц.

Таблица hospital_payment_data

id  chart_num   treatment_fees_difference    treatment_fees_check_division
1        9         200000                            test
2        9        -100000                            test 
3        10        200000                            test
4        10       -100000                            test

Таблица advenced_payment

 id  chart_num      advenced_amount

  1      9          100000
  2      10         100000

Я хочу результат

   if_treatment_fees_check_division         sum_init_amount     test       COUNT  
          200000                               200000           400000       4

Однако при отправке запроса выводятся следующие результаты.

SELECT 
        SUM(t_join.treatment_fees_difference) if_treatment_fees_check_division, 
        SUM(t_join.advenced_amount) sum_init_amount, 
        SUM(t_join.treatment_fees_difference) + SUM(t_join.advenced_amount) test,
        COUNT(*) "count"
  FROM 
  ( 
    SELECT t_a.treatment_fees_difference , IFNULL(t_b.advenced_amount,0 ) AS advenced_amount
      FROM hospital_payment_data t_a  
      LEFT OUTER JOIN advenced_payment t_b on t_a.chart_num = t_b.chart_num
     WHERE t_a.treatment_fees_check_division = 'test' 
  ) t_join

плохой результат

enter image description here Как исправить запрос, чтобы получить желаемые результаты?

1 Ответ

0 голосов
/ 08 апреля 2020

Проблема заключается в том, что вы присоединяетесь к таблицам, что даст вам две строки в результатах, а затем вы суммируете значения с sum(t_join.advenced_amount) sum_init_amount, что дает вдвое большее значение, которое вы хотите. Это быстрое и неприятное исправление:

SELECT 
        sum(t_join.treatment_fees_difference) if_treatment_fees_check_division, 
         MIN(t_join.advenced_amount) sum_init_amount     , 
        sum(t_join.treatment_fees_difference) + sum(t_join.advenced_amount) test,
        COUNT(*) "count"
FROM 
(   
    SELECT t_a.treatment_fees_difference , IFNULL(t_b.advenced_amount,0 ) AS advenced_amount
    FROM hospital_payment_data t_a  LEFT OUTER JOIN   advenced_payment t_b on t_a.chart_num = t_b.chart_num
    WHERE t_a.treatment_fees_check_division = 'test' 
) t_join

Но это, вероятно, не удастся в реальном приложении. Попробуйте это так (не проверено):

SELECT 
       if_treatment_fees_check_division, 
       advenced_amount AS sum_init_amount , 
       if_treatment_fees_check_division + advenced_amount AS test,
       row_count AS "count"
FROM 
(   
    SELECT 
      SUM(treatment_fees_difference) as if_treatment_fees_check_division,
      count(*) as row_count, 
      chart_num
    FROM hospital_payment_data  
    WHERE treatment_fees_check_division = 'test' 
    GROUP BY chart_num
) as TABLE1
LEFT OUTER JOIN advenced_payment AS TABLE2 
ON TABLE1.chart_num = TABLE2.chart_num
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...