Вопросы с SQL - разделение столбца на две части - PullRequest
0 голосов
/ 15 апреля 2019

Я не знаю, как я могу ответить на этот вопрос.Потому что имя и фамилия в одном столбце.Мне не разрешено изменять столбцы.

"Получить средние расходы (на одного клиента) всех клиентов, которые делят фамилию с другим клиентом"

Я думал сказать в sqlite3

SELECT avg_spending 
FROM customer 
JOIN customer on WHERE name is name;

Вот как определяется таблица:

CREATE TABLE customer 
(
    cuid INTEGER,
    name STRING,
    age INTEGER,
    avg_spending REAL,
    PRIMARY KEY(cuid)
);

Таким образом, эти значения имеют одинаковую фамилию

INSERT INTO customer VALUES (4, "Henk Krom", 65, 24);
INSERT INTO customer VALUES (9, "Bob Krom", 66, 4);

Ответы [ 3 ]

1 голос
/ 15 апреля 2019

Исходя из отправленных вами примеров данных, я предполагаю, что формат имени столбца:

FirstName LastName

, поэтому вам нужно извлечь LastName и использовать group by, чтобы получить среднее значение:

select 
  substr(name, instr(name, ' ') + 1) lastname,
  avg(avg_spending) avg_spending
from customer 
group by lastname
having count(*) > 1

Условие hasing ограничивает результаты теми именами клиентов, которые имеют как минимум 1 другое имя клиента с такой же фамилией.Смотрите демо .Для данных примера:

> cuid | name      | age | avg_spending
> :--- | :-------- | :-- | :-----------
> 4    | Henk Krom | 65  | 24          
> 9    | Bob Krom  | 66  | 4           
> 5    | Jack Doe  | 66  | 4           
> 7    | Jill Doe  | 66  | 6           
> 1    | Alice No  | 66  | 44   

вы получите результаты:

> lastname | avg_spending
> :------- | :-----------
> Doe      | 5           
> Krom     | 14 
0 голосов
/ 15 апреля 2019

Как уже упоминалось в комментариях, суть в том, чтобы найти правило, как надежно извлечь фамилию из имени.Кроме того, вам просто нужно предложение о существовании, потому что вы хотите выбрать клиентов, для которых существует другой клиент с такой же фамилией.

(«Получить средние расходы (на одного клиента)» просто означает получить строку из таблицыпотому что каждая строка содержит ровно одного клиента и его средние расходы.)

Если бы все имена были в формате first name - blank - last name, это было бы:

select * 
from customer c
where exists
(
  select *
  from customer other
  where other.cuid <> c.cuid
  and substr(other.name, instr(other.name, ' ') + 1) = substr(c.name, instr(c.name, ' ') + 1)
);
0 голосов
/ 15 апреля 2019

Вы были правы в присоединении таблицы клиентов к себе, но вам также нужно проанализировать фамилию, чтобы сравнить и удалить дубликаты после того, как совпадение было найдено, поскольку если nameA равно nameB, тогда nameB должно совпадать с nameA.

with custs AS
(
select distinct
    a.name as name_1 , 
    b.name as name_2
from customer a
join customer b
 on substr(a.name, instr(a.name, ' ') + 1) = substr(b.name, instr(b.name, ' ') + 1)  
where a.name like '%Krom%' and a.name <> b.name
)
select * from customer where name in (select name_1 from custs)
union 
select * from customer where name in (select name_2 from custs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...