【问题标题】:Organising data to remove duplicates in certain columns组织数据以删除某些列中的重复项
【发布时间】:2017-10-27 10:25:52
【问题描述】:

我目前正在尝试制作一个 SQL 报告,该报告可以显示有关新行和删除重复行的信息。

为了这个例子,我有一列(汽车),它从 tableA 中获取一个字段,然后链接到 tableB(颜色)。类似于下表。

-----------------------------
|Car (TableA)|Colour(TableB)|
-----------------------------
|CarA        |Blue          |
|CarA        |Black         |
|CarA        |Yellow        |
|CarB        |Purple        |
|CarB        |Orange        |
|CarB        |Black         |
-----------------------------

相反,我试图让我的数据显示如下内容:

-----------------------------
|Car (TableA)|Colour(TableB)|
-----------------------------
|CarA        |Blue          |
|            |Black         |
|            |Yellow        |
|            |              |
|CarB        |Purple        |
|            |Orange        |
|            |Black         |
-----------------------------

【问题讨论】:

  • 所以你想乘车分组,但没有重复的行?
  • 您使用的是哪个DBMS 产品? “SQL”只是一种查询语言,并不是特定数据库产品的名称。
  • 是的。我知道我可以更好地解释这一点,所以很抱歉我没有解释。
  • DBMS,Microsoft SQL server

标签: sql sql-server sap


【解决方案1】:

这应该是诀窍:

declare @tbl as table (
    car varchar(10)
    ,brand varchar(10)
    ,colour varchar(10)
)

insert into @tbl values ('CarA', 'Tesla', 'Blue')
insert into @tbl values ('CarA', 'Tesla', 'Black')
insert into @tbl values ('CarA', 'Tesla', 'Yellow')
insert into @tbl values ('CarB', 'Kia', 'Purple')
insert into @tbl values ('CarB', 'Kia', 'Orange')
insert into @tbl values ('CarB', 'Kia', 'Black')
insert into @tbl values ('CarC', 'Ford', 'Green')

SELECT
    CASE WHEN rn > 1 THEN '' ELSE car END AS car
    ,colour
FROM (
    SELECT
        car
        ,colour
        ,ROW_NUMBER() OVER (PARTITION BY car ORDER BY car, colour ASC) rn
    FROM @tbl
) tbl

更新

假设您在car 和colour 之间有brand:

SELECT
    CASE WHEN rn > 1 THEN '' ELSE car END AS car
    ,CASE WHEN rn > 1 THEN '' ELSE brand END AS brand
    ,colour
FROM (
    SELECT
        car
        ,brand
        ,colour
        ,ROW_NUMBER() OVER (PARTITION BY car, brand ORDER BY car, colour ASC) rn
    FROM @tbl
) tbl

【讨论】:

  • 谢谢,使用您的测试数据,这似乎符合我的要求。例如,我要在“汽车”和“颜色”之间添加另一列,我们将此列命名为“品牌”。我将如何将其实施到您提供的内容中?我玩过,但似乎无法退出。示例数据可能与上述相同,但品牌如下:CarA's = Tesla,CarB's = Kia,CarC's = Ford
  • 使用PARTITION BY car, brand ...如果这将是您的新“组”,请这么说;并且您在brand 列上使用相同的CASE WHEN
  • 我已经设法展示了品牌栏,但我不确定您所说的“品牌案例”部分是什么意思。目前我得到了:CASE WHEN rn > 1 THEN ' ' ELSE car END AS car, brand, colour 如果我没记错的话,它与语句的 ELSE 部分有关,不是吗?
  • 您不希望brand 列的行为与car 列的行为相同吗?
  • 是的,这就是我的目标。所以car 和brand 都删除了重复项,但colour 没有
猜你喜欢
  • 2021-05-14
  • 2019-11-04
  • 2011-07-23
  • 1970-01-01
  • 2013-05-28
  • 1970-01-01
  • 1970-01-01
  • 2023-02-25
  • 2012-11-13
相关资源
最近更新 更多