SQL问题-将一栏一分为二

时间:2019-04-15 16:50:05

标签: sql sqlite

我不知道如何回答这个问题。因为名称和姓氏在同一列中。我不允许更改列。

“获取与另一个客户共享姓氏的所有客户的平均支出(每个客户)”

我想在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 个答案:

答案 0 :(得分:1)

从您发布的样本数据中,我猜想列名的格式为:

FirstName LastName

因此您需要提取姓氏并使用group by来获取平均值:

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

having子句将结果限制为具有至少一个其他姓氏相同的其他客户名称的客户名称。
请参见demo
对于示例数据:

> 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 

答案 1 :(得分:0)

将客户表与其自身联接是正确的,但是一旦找到匹配项,还需要解析姓氏以进行比较并删除重复项,因为如果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)

答案 2 :(得分:0)

正如评论中提到的,关键是找到一条规则,以便从名称中可靠地提取姓氏。除此之外,您只需要一个exist子句,因为您想选择存在相同姓氏的另一个客户所在的客户。

(“获取(每位客户)的平均支出”只是意味着从表中获得一行,因为每一行仅包含一个客户及其平均支出。)

如果所有名称的格式均为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)
);