сумма значений с нечувствительным к регистру объединением некорректно группируется - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть две таблицы, к которым я хочу присоединиться без учета регистра. Благодаря другим темам на SO это работает с использованием lower (). Тем не менее, результат не группируется по значениям в нижнем регистре, но по-прежнему чувствителен к регистру. Как настроить запрос таким образом, чтобы в группе не учитывался регистр?

Пример данных: Таблица 1 (сейчас используется только 1 столбец этой таблицы, хотя метаданных больше;):

keyword
TEST
ABC
ASF
QWERTY

Таблица 2:

Date - term - value
2020-01-01 - test - 3
2020-01-01 - Test - 2
2020-01-03 - TEST - 4
2020-01-01 - abc - 6
2020-01-02 - ABC - 7
2020-01-02 - abc - 3

Желаемый вывод:

keyword - sum(value)
test - 9
abc - 16

Текущий вывод:

keyword - sum(value)
test - 3
test - 2
test - 4
abc - 9
abc - 7

Запрос, который я использую:

select distinct lower(keyword), value
FROM Table1 t1
join (select lower(term) term, sum(value) value from Table2 group by term) t2 on lower(t1.keyword) = lower(t2.term) 
GROUP BY t2.term, t1.keyword, t2.value

Кажется, все выходные потребности (другое) сгруппировать, но сгруппирую я или нет, это не изменит результат Что мне здесь не хватает?

Ответы [ 2 ]

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

Один из простых вариантов в данном случае - просто прописать обе стороны условия соединения в нижнем регистре:

SELECT
    t1.keyword,
    SUM(t2.value) AS total
FROM table1 t1
LEFT JOIN table2 t2
    ON LOWER(t1.keyword) = LOWER(t2.term)
GROUP BY
    t1.keyword;

Обратите внимание, что использование LOWER в нескольких местах соединения, вероятно, означает, что ваш запрос не сможет используйте любой индекс. Для достижения максимальной эффективности рассмотрите возможность хранения данных о вашем ключевом слове / термине в одном и том же случае.

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

Используйте lower() в GROUP BY, если вы хотите сгруппировать по пониженному значению. Также ваш запрос может быть упрощен. Там нет необходимости для производной таблицы или DISTINCT.

SELECT lower(t1.keyword),
       sum(t2.value) value
       FROM table1 t1
            INNER JOIN table2 t2
                       ON lower(t1.keyword) = lower(t2.term)
       GROUP BY lower(t1.keyword);
...