当值在sql中重复时如何对列进行分组

Posted

技术标签:

【中文标题】当值在sql中重复时如何对列进行分组【英文标题】:How to group columns when the value repeats in sql 【发布时间】:2016-03-31 06:41:06 【问题描述】:

我将我的 Access DB 连接到一个 Excel 文件并执行了一些简单的 SQL 查询,我想做一些我不知道是否可行的事情。

当值重复时,我想在列中对值进行分组。

例如,这里是一个简单的查询结果:

ID | Name | Color 1 John Red 1 John Yellow 2 Bill Red 2 Bill Blue 2 Bill Black

我希望结果以这种方式呈现:

ID | Name | Color 1 John Red Yellow 2 Bill Red Blue Black

这可能吗?

感谢您的回答!

谢谢。

【问题讨论】:

单独使用sql是不行的。你需要它做什么? 我需要它来方便地显示数据,因为我的查询结果比那个简单的查询要大得多。 @ImranAli 所有标签都是相关的:使用 Excel 连接我的 Access 数据源并执行 SQL 查询。 @GiladK 如果您在 MS Access 中生成报告,则可以按照您想要的方式生成报告。您只需按照访问报告向导并将您的数据分组到名称列 @GiladK 你熟悉使用 VBA 吗?向下移动列IDName 很简单,如果值等于上面的值,则清除单元格。创建 excel 文件后,此方法更容易。 【参考方案1】:

这不可能是 SQL 查询的结果,查询将显示与“颜色”字段关联的“ID”和“名称”字段中的值(如果存在)。此外,在查询结果中,不会有将 Blue 关联到 Bill 而不是 Jhon

如果您的目标是在 Excel 中显示,您可以让代码从下到上遍历 Cols ID 和 NAME,并删除值等于上面单元格的单元格。

【讨论】:

【参考方案2】:

给你..没有什么是不可能的..

create table tbl_table
(Id int,
Name varchar(32),
Color varchar(16)
)
go

insert into tbl_table
values(1,'John','Red');
insert into tbl_table
values(1,'John','Yellow');
insert into tbl_table
values(2,'Bill','Red');
insert into tbl_table
values(2,'Bill','Blue');
insert into tbl_table
values(2,'Bill','Black');
go

select a.id,case when a.Id=b.Id and a.rowid<>b.rowid then NULL else a.Name end,a.Color
from
(
select ROW_NUMBER () OVER (Order by Id asc ) rowid,* from tbl_table
) a
left join
(
select ROW_NUMBER () OVER (Order by Id asc ) rowid,* from tbl_table
) b
on a.rowid-1=b.rowid

谢谢

【讨论】:

这个查询对我不起作用。我正在尝试在 Access 的 SQL 查询编辑器中执行查询。 你使用哪个版本..?? 我正在使用 Access 2013 我们可以使用团队查看器吗..? 请格式化您的代码。 ROW_NUMBER () 用于 SQL Server,Access 没有这个。【参考方案3】:
create table tbl_table
(Id int,
Name varchar(32),
Color varchar(16)
)
go

insert into tbl_table
values(1,'John','Red');
insert into tbl_table
values(1,'John','Yellow');
insert into tbl_table
values(2,'Bill','Red');
insert into tbl_table
values(2,'Bill','Blue');
insert into tbl_table
values(2,'Bill','Black');
go

select a.id,case when a.Id=b.Id and a.rowid<>b.rowid then NULL else a.Name end,a.Color
from
(
select DCount("[ID]","[tbl_table]","[ID]<=" & [ID]) rowid,* from tbl_table
) a
left join
(
select DCount("[ID]","[tbl_table]","[ID]<=" & [ID]) rowid,* from tbl_table
) b
on a.rowid-1=b.rowid

试试这个

【讨论】:

@Andre 嗨,由于某种原因它不起作用。我收到错误消息:“查询表达式中的语法错误(缺少运算符)'case when a.Id=b.Id and a.rowidb.rowid then NULL else a.Name end'。”并在我点击确定后立即标记“何时”。 @GiladK:这段代码不是我写的,我只是格式化了。 :) 您需要使用 IIf() 而不是 Case When。 我用 IIf() 替换了大小写,现在 DCount 上显示错误。我收到与“case when”相同的错误,现在使用“DCount”..

以上是关于当值在sql中重复时如何对列进行分组的主要内容,如果未能解决你的问题,请参考以下文章

仅当某个状态为真时如何对列进行分组

根据每个值对列的值进行分组[重复]

pandas 如何使用 groupby 在标签中按日期对列进行分组?

在sql中使用case语句根据某些条件对列进行分组

如何在 PostgreSQL 中对列的一部分进行分组?

excel如何不重复分组