Подсчет элементов, которые имеют разное форматирование с SQL - PullRequest
0 голосов
/ 16 сентября 2018

Я запутался, как считать элементы, которые одинаковы, но имеют различное форматирование. Например, мы хотим знать, сколько у людей разных фруктов и есть следующие данные:

Mary|Apple|
Mary|apple|
Mary|Apple |
Mary|Orange|
Liu|Grape|
Liu|Apple|

Ожидаю выхода

Mary|2
Liu|2

Но если я сделаю count(distinct fruits), тогда я получу

Mary|4
Liu|2

Есть ли способ справиться с форматированием в этом случае?

Ответы [ 3 ]

0 голосов
/ 16 сентября 2018

Вы можете посчитать их:

  • Удаление начальных и конечных пробелов - используйте TRIM().
  • Снятие регистра букв - используйте LOWER().

Как в:

select
    name,
    count(distinct lower(trim(fruits))) 
  from my_table
  group by name

Вы можете использовать ту же стратегию с колонкой name, если она имеет аналогичные нарушения.

0 голосов
/ 16 сентября 2018

DISTINCT не единственный инструмент здесь. Вы можете использовать GROUP BY с нормализованной версией текста столбца, чтобы объединить все различные оболочки и конечные пробелы в один. Например:

SELECT name, fruit, count(fruit) AS cnt
FROM test
GROUP BY name, trim(upper(fruit));

дает мне

name        fruit       cnt       
----------  ----------  ----------
Liu         Apple       1         
Liu         Grape       1         
Mary        Apple       3         
Mary        Orange      1         

Однако, похоже, вы хотите общее количество разных видов фруктов на человека. Итак ...

WITH totals(name, fruit) AS
  (SELECT name, fruit
   FROM test
   GROUP BY name, trim(upper(fruit)))
SELECT name, count(fruit) AS fruits
FROM totals
GROUP BY name;

дает мне

name        fruits    
----------  ----------
Liu         2         
Mary        2  
0 голосов
/ 16 сентября 2018

Возьмите различное количество строчных версий названий фруктов:

SELECT
    name,
    COUNT(DISTINCT LOWER(TRIM(fruit))) AS cnt
FROM yourTable
GROUP BY
    name;

Демо

Демо-версия в MySQL,но та же логика должна работать в SQLite.

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