当值在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 吗?向下移动列ID
和Name
很简单,如果值等于上面的值,则清除单元格。创建 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中重复时如何对列进行分组的主要内容,如果未能解决你的问题,请参考以下文章