【问题标题】:How to group columns when the value repeats in sql当值在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 文件后,此方法更容易。

标签: sql excel ms-access accessdatasource


【解决方案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”..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    相关资源
    最近更新 更多