【问题标题】:How to hide duplicate values from rows in sql如何在sql中的行中隐藏重复值
【发布时间】:2017-06-08 00:08:00
【问题描述】:

我正在尝试将表格数据导出为 excel 格式。

我当前视图的选择查询给出这样的结果..

IDs  Column_A  Column_B  Column_C  Column_D   Column_E  
1    EDC        RFV       TGB       UJM        14789     
2    EDC        RFV       TGB       UJM        22225

但我想得到这样的结果......

IDs  Column_A  Column_B  Column_C  Column_D   Column_E  
1    EDC        RFV       TGB       UJM        14789     
2                                              22225

那么如何实现呢?

【问题讨论】:

    标签: c# sql sql-server excel sql-server-2008


    【解决方案1】:

    不要在 SQL 中这样做。事实上,我什至不认为这在 Excel 中是一个好主意。删除值后,您将无法执行过滤列值或创建数据透视表等操作。

    可以在 SQL 中执行此操作。一种简单的方法是使用lag()

    select . . .,
           (case when lag(column_a) over (order by id) = column_a then NULL
                 else column_a
            end) as column_a,
           . . .
    

    但仅仅因为你能做到并不意味着你应该这样做。

    【讨论】:

    • 它给了我警告,因为“'lag' 不是一个公认的内置函数名”。实际上我使用的是 SQL SERVER 2008
    • LAG 是在 SQL Server 2012 中引入的。您可以解决它,但正如 Gordon Linoff 所说,这是一个坏主意。
    • 是的! Gordon Linoff 的观点是有效的,但我只想以这种格式显示数据。这里不需要任何过滤。
    【解决方案2】:

    这是用于 SQL 2008 的方法,使用带有某些分区的 ROW_NUMBER() 而不是 LAG。请注意,如果您可以访问 2012+,LAG 解决方案应该更有效(且可读性更强)。

    DECLARE @tbl TABLE (IDs int,Column_A char(3), Column_B char(3), Column_C char(3),Column_D char(3),Column_E int)
    
    insert @tbl
    VALUES 
    (1,'EDC','RFV','TGB','UJM',14789)
    ,(2,'EDC','RFV','TGB','UJM',22225)
    ,(3,'EDC','RFV','TGB','UJM',22222)
    ,(4,'ECD','RFV','TGB','UJM',22222)
    
    
    select IDs
            ,(case when ROW_NUMBER() over (PARTITION BY Column_A order by ids) <> 1 then NULL
                 else column_a
                end) as column_a
                ,(case when ROW_NUMBER() over (PARTITION BY Column_B order by ids) <> 1 then NULL
                 else column_B
                end) as column_b
                ,(case when ROW_NUMBER() over (PARTITION BY Column_C order by ids) <> 1 then NULL
                 else column_c
                end) as column_c
                ,(case when ROW_NUMBER() over (PARTITION BY Column_D order by ids) <> 1 then NULL
                 else column_D
                end) as column_D
            ,Column_E
    FROM @tbl
    

    输入:

    1   EDC     RFV     TGB     UJM     14789
    2   EDC     RFV     TGB     UJM     22225
    3   EDC     RFV     TGB     UJM     22222
    4   ECD     RFV     TGB     UJM     22222
    

    输出:

    1   EDC     RFV     TGB     UJM     14789
    2   NULL    NULL    NULL    NULL    22225
    3   NULL    NULL    NULL    NULL    22222
    4   ECD     NULL    NULL    NULL    22222
    

    但同样,这可能会导致比它解决的问题更多的问题。我会考虑对数据进行透视/反透视或以其他方式重新排列数据是否更有意义,也许是为了有效地显示每个 Column_A/B/C/D 的 ID 列表。

    【讨论】:

      猜你喜欢
      • 2014-08-07
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多