Процентное исчисление на основе нескольких таблиц в sql - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть две таблицы в sql, и мне нужно создать другую таблицу, выполняющую вычисления на основе двух других таблиц.

В первой есть сумма дохода для каждого рекламного блока, имя таблицы - ad_unit_table

SELECT
    d.`Date`,
    'App' as `Partner`,
    d.`Ad Unit`,
    sum(d.`Revenue`) as `Revenue`
from
    `d_master` as d
group by
    `Ad Unit`, `Date`

В другой таблице есть сумма дохода для всех рекламных блоков, имя таблицы - sum_revenue

SELECT
    `Date`,
    `Partner`
    `Ad Unit`,
    sum(`Revenue`) as `Sum Revenue`
from
    `ad_unit_table`
group by
    `Date`

Теперь мне нужно найти процент дохода для каждого рекламного блока. Таким образом, формула (рекламный блок Rev / Sum Rev) * 100. Мой код в настоящее время выглядит следующим образом:

SELECT
    ad.`Date`,
    ad.`Partner`,
    ad.`Ad Unit`,
   (ad.`Revenue` / s.`Sum Revenue`) * 100 as `Percentage`
FROM
    `ad_unit_table` as ad
    LEFT JOIN `sum_revenue` as s ON ad.`Partner`
GROUP BY
    `Date`,
    `Ad Unit`

Это дает мне все NULL. Буду признателен за любую помощь. Спасибо!

1 Ответ

0 голосов
/ 09 февраля 2020

Вы уверены, что хотите сделать LEFT JOIN sum_revenue as s ON ad.Partner в своем последнем запросе ?. Я протестировал эту конструкцию, и это создает так называемое декартово произведение. Все строки левой таблицы объединяются со всеми строками другой таблицы.

См .: https://en.wikipedia.org/wiki/Cartesian_product

Например:

 create table testing.test_a (id INT);
 create table testing.test_b (id INT);

INSERT INTO test_a VALUES(1),(2),(3),(4);
INSERT INTO test_b VALUES(1),(2),(3),(5);

# Resulting in a cartesian product (4x4 entries)
SELECT * FROM test_a AS a LEFT JOIN test_b AS b ON a.id;

+------+------+
| id   | id   |
+------+------+
|    1 |    1 |
|    2 |    1 |
|    3 |    1 |
|    4 |    1 |
|    1 |    2 |
|    2 |    2 |
|    3 |    2 |
|    4 |    2 |
|    1 |    3 |
|    2 |    3 |
|    3 |    3 |
|    4 |    3 |
|    1 |    5 |
|    2 |    5 |
|    3 |    5 |
|    4 |    5 |
+------+------+

# Correctly LEFT joining test_a and test_b would be:
SELECT a.id, b.id FROM test_a AS a LEFT JOIN test_b AS b ON a.id = b.id

# Or use the USING clause to join on column from both tables with same name.
SELECT test_a.id, test_b.id FROM test_a LEFT JOIN test_b USING(id);

+------+------+
| id   | id   |
+------+------+
|    1 |    1 |
|    2 |    2 |
|    3 |    3 |
|    4 | NULL |
+------+------+

Вы уверены, что в таблице sum_revenue есть записи для всех единиц в ad_unit_table. Если это не так, некоторые значения из sum_revenue приводят к значениям NULL из-за несовпадающих записей. Если вы хотите, чтобы значения соответствовали, используйте INNER JOIN вместо LEFT JOIN.

Также убедитесь, что, когда могут быть вычисления. ни одно из значений NULL. Выполнение вычислений со значениями NULL приводит к значениям NULL.

Пример:

SELECT 100 / NULL;         -- Result NULL
SELECT (10 * NULL) * 100;  -- Result NULL

Без дополнительной информации, такой как определения таблиц и / или примеры данных, это все, что я могу сделать.

...