mysql сгруппировать и соотношение между двумя суммами - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть запрос, который суммирует поле 'value' из строк со значением внешнего ключа V1 и делит эту сумму на сумму поля 'value' из строк со значением внешнего ключа V2. Почему-то я получаю неправильные результаты. Что я здесь не так делаю?

SELECT 
    iv1.year, 
    1, 
    iv1.country_code, 
    SUM(iv1.value) / SUM(iv2.value) AS value, # Formula 
    'Added using stored procedure for creation of 1 indicator as ratio of 2 over 6 indicators' AS additional_info
FROM 
    indicators_values iv1
    JOIN indicators i1 ON (i1.no_of_indicator IN('B1.1.2.3', 'B1.2.2.2') 
            AND iv1.indicator_id = i1.indicator_id 
            AND i1.extracted_from_file_type = 'consolidated-a')
    JOIN indicators_values iv2 ON (iv2.country_code = iv1.country_code AND iv2.year = iv1.year)
    JOIN indicators i2 ON (i2.no_of_indicator IN('B1.1.2.2', 'B1.1.2.3', 'B1.1.2.4', 'B1.2.2.1', 'B1.2.2.2', 'B1.2.2.3') 
            AND iv2.indicator_id = i2.indicator_id 
            AND i2.extracted_from_file_type = 'consolidated-a')
WHERE 
    1=1 
    AND iv1.country_code = 'AT' 
    AND i1.no_of_indicator IN('B1.1.2.3', 'B1.2.2.2') 
    AND i2.no_of_indicator IN('B1.1.2.2', 'B1.1.2.3', 'B1.1.2.4', 'B1.2.2.1', 'B1.2.2.2', 'B1.2.2.3')
GROUP BY 
    iv1.year, iv1.country_code;

Я знаю, что получаю неправильные результаты, потому что большинство результатов, которые я получаю, больше 1, и все они должны быть меньше 1, так как я должны иметь в знаменателе те же значения, что и в числителе, плюс некоторые дополнительные. Пожалуйста, порекомендуйте? Спасибо!

1 Ответ

1 голос
/ 13 февраля 2020

Схематически (слишком ленив, чтобы понять ваши условия - возможно, что-то отсутствует или поменялся местами):

SELECT iv.year, 
       iv.country_code,
       (   SUM(CASE WHEN i.no_of_indicator IN('B1.1.2.3', 'B1.2.2.2')
                    THEN iv.value
                    END) 
         /
           SUM(CASE WHEN i.no_of_indicator IN('B1.1.2.2', 'B1.1.2.3', 'B1.1.2.4', 'B1.2.2.1', 'B1.2.2.2', 'B1.2.2.3')
                    THEN iv.value
                    END
       ) AS value

FROM indicators_values iv
JOIN indicators i ON iv.indicator_id = i.indicator_id 
WHERE i.extracted_from_file_type = 'consolidated-a'
  AND iv.country_code = 'AT' 
GROUP BY iv.year, iv.country_code

PS. Делитель может формально быть нулевым - будьте осторожны, чтобы не получить деление на ноль ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...