【问题标题】:ms-access 2010: count duplicate names per household addressms-access 2010:计算每个家庭地址的重复姓名
【发布时间】:2015-11-10 11:19:23
【问题描述】:

我目前正在使用 MS Access 2010 中的电子表格,其中包含大约 13 万行关于最近在地方选举中投票的人的信息。每行都有他们的住宅信息(街道名称、号码、邮政编码等)和个人信息(头衔、姓氏、名字、中间名、出生日期等)。每行代表一个人,而不是一个家庭(因此,在许多情况下,同一个住址会出现不止一次,因为一个特定的家庭中居住着不止一个人)。

我想要实现的基本上是在这个数据集中创建一个名为“count”的新字段。我希望这个字段可以让我计算一个地址中有多少不同的姓氏。

是否有允许我在 Access 2010 中执行此操作的 SQL 脚本?

+------------------+----------+-------+---------+----------+-------------+
| PROPERTYADDRESS1 | POSTCODE | TITLE | SURNAME | FORENAME | MIDDLE_NAME |
+------------------+----------+-------+---------+----------+-------------+
 FAKEADDRESS1        EEE 5GG    MR      BLOGGS    JOE           N         
 FAKEADDRESS2        EEE 5BB    MRS     BLOGGS    SUZANNE       P        
 FAKEADDRESS3        EEE 5RG    MS      SMITH     PAULINE       S
 FAKEADDRESS4        EEE 4BV    DR      JONES     ANNE          D
 FAKEADDRESS5        EEE 3AS    MR      TAYLOR    STUART        A

到目前为止,以下语法让我很接近:

SELECT COUNT(electoral.SURNAME)
FROM electoral
GROUP BY electoral.UPRN

但是,它没有返回所有 130k 奇数行,而是只返回了大约 67k 行。我可以对语法做些什么来获得相同的结果,但只返回每一行?

非常感谢任何帮助!

谢谢

【问题讨论】:

  • 这将有助于发布相关列的一些示例数据(组成数据)。使用sensefulsolutions.com/2010/10/format-text-as-table.html
  • 嗨@Andre451 我已将示例数据附加到原始问题中。任何帮助将不胜感激。
  • 嗨@Andre451 - 我已经编辑了原始问题。我已经非常接近实现我的目标,但还没有完全实现。任何帮助将不胜感激

标签: sql ms-access ms-access-2010


【解决方案1】:

你可以这样使用:

select *,
count(surname) over (partition by householdName)
from myTable

如果您只有一列包含名称, 例如:Rob Adams 那么您可以这样做以将所有姓氏放在不同的列中,这样在选择时会更容易:

SELECT LEFT('HELLO WORLD',CHARINDEX(' ','HELLO WORLD')-1) 

在我们的例子中:

select right (surmane, charindex (' ',surname)-1) as surname 

charindex的使用示例,左右:

http://social.technet.microsoft.com/wiki/contents/articles/17948.t-sql-right-left-substring-and-charindex-functions.aspx

如果有任何问题,请发表评论。

编辑:我编辑了查询,出现语法错误,请重试。这适用于 sql server。

这是一个例子:

create table #temp  (id int, PropertyAddress varchar(50), surname varchar(50), forname varchar(50))
insert into #temp values 
(1, 'hiddenBase',  'Adamns' , 'Kara' ),
(2, 'hiddenBase',  'Adamns' , 'Anne' ),
(3, 'hiddenBase',  'Adamns' , 'John' ),
(4, 'QueensResidence',  'Queen' , 'Oliver' ),
(5, 'QueensResidence',  'Queen' , 'Moira' ),
(6, 'superSecretBase', 'Diggle' , 'John' ),
(7, 'NandaParbat',  'Merlin' , 'Malcom' )

select * from #temp

select *, 
count (surname) over (partition by PropertyAddress) as CountMembers
from #temp

给出:

1   hiddenBase  Adamns  Kara    3
2   hiddenBase  Adamns  Anne    3
3   hiddenBase  Adamns  John    3
7   NandaParbat Merlin  Malcom  1
4   QueensResidence Queen   Oliver  2
5   QueensResidence Queen   Moira   2
6   superSecretBase Diggle  John    1

您的查询应如下所示:

select *, 
count (SURNAME) over (partition by PropertyAddress) as CountFamilyMembers
from electoral 

编辑

如果不支持 over partition by,那么我想您可以使用 group by 获得您想要的结果

select *, 
    count (SURNAME) over (partition by PropertyAddress) as CountFamilyMembers
    from electoral 
group by -- put here the fields in the select (one by one), however you can't write group by *

【讨论】:

  • 你好CM2K,个人信息被分成不同的列,所以标题、姓、名、中间名和出生日期都在不同的列中。我唯一感兴趣的是姓氏,因为我想知道一个地址有多少不同的姓氏。由于某种原因,您发送的语法似乎在 Access 中不起作用。我可能没有正确输入它:
     SELECT *, COUNT (electal.SURNAME) OVER PARTITION BY (electal.PropertyAddress1); 
  • 如果您可以编辑您的问题并添加一些示例数据,供我测试一下。那太好了
  • 嗨 CM2K,我已将数据集的示例图像附加到原始问题中,希望这对您有所帮助。再次感谢您的帮助。
  • 我有一个语法错误,请查看我编辑的答案(ps,我正在 sql server 2012 上测试这个,应该也可以在访问中工作)
  • 嗨 CM2K,感谢您迄今为止的所有帮助,我将尝试这种语法并告诉您它是如何进行的。
【解决方案2】:

GROUP BY 创建一个聚合查询,因此您可以根据设计获得更少的记录(每个 UPRN 一条)。

要获取原始表中每一行的计数,您可以使用聚合查询连接表:

SELECT electoral.*, elCount.NumberOfPeople
FROM electoral 
INNER JOIN
(    
    SELECT UPRN, COUNT(*) AS NumberOfPeople
    FROM electoral
    GROUP BY UPRN
) AS elCount
ON electoral.UPRN = elCount.UPRN

【讨论】:

  • 不错的解决方案,我比我更喜欢它:)
【解决方案3】:

鉴于更新我想发布另一个答案。试试这样:

create table #temp2  ( PropertyAddress1 varchar(50), POSTCODE varchar(20), TITLE varchar (20), 
surname varchar(50), FORENAME varchar(50), MIDDLE_NAME varchar (50) )

insert into #temp2 values 
('FAKEADDRESS1', 'EEE 5GG', 'MR', 'BLOGGS', 'JOE', 'N'),
('FAKEADDRESS1', 'EEE 5BB', 'MRS', 'BLOGGS', 'SUZANNE', 'P'),
('FAKEADDRESS2', 'EEE 5RG', 'MS', 'SMITH', 'PAULINE', 'S'),
('FAKEADDRESS3', 'EEE 4BV', 'DR', 'JONES', 'ANNE', 'D'),
('FAKEADDRESS4', 'EEE 3AS', 'MR', 'TAYLOR', 'STUART', 'A')

select PropertyAddress1, surname,count (#temp2.surname) as CountADD
into #countTemp
from #temp2 
group by PropertyAddress1, surname

select * from #temp2 t2
left join #countTemp ct
on t2.PropertyAddress1 = ct.PropertyAddress1 and t2.surname = ct.surname

这会产生:

PropertyAddress1        POSTCODE    TITLE   surname FORENAME    MIDDLE_NAME PropertyAddress1    surname CountADD
FAKEADDRESS1             EEE 5GG    MR      BLOGGS  JOE                N    FAKEADDRESS1        BLOGGS     2
FAKEADDRESS1             EEE 5BB    MRS     BLOGGS  SUZANNE            P    FAKEADDRESS1        BLOGGS     2
FAKEADDRESS2             EEE 5RG    MS      SMITH   PAULINE            S    FAKEADDRESS2        SMITH      1
FAKEADDRESS3             EEE 4BV    DR      JONES   ANNE               D    FAKEADDRESS3        JONES      1
FAKEADDRESS4             EEE 3AS    MR      TAYLOR  STUART             A    FAKEADDRESS4        TAYLOR     1

【讨论】:

  • 嗨 CM2K,与计算同一地址的相同姓氏的数量相反,我想计算居住在同一地址的不同姓氏的数量。例如。在您刚刚发布的答案中,mr 和 mrs bloggs 旁边的计数将是 1,因为他们有一个共同的姓氏并且居住在同一个地址。这有意义吗?如有任何混淆,我们深表歉意!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
  • 2016-12-26
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
相关资源
最近更新 更多