【问题标题】:SQL query to handle the grouping - SSRS用于处理分组的 SQL 查询 - SSRS
【发布时间】:2018-02-16 06:12:46
【问题描述】:

我的sql查询

SELECT SEX, col1, col2, col3, A1, A2 FROM Table1

这样的结果

如何编写查询以获得如下结果

实际上,我必须在 SSRS 表中生成这样的结果。您还可以建议在 SSRS 结果中处理这种情况以打印上面的列表。

【问题讨论】:

  • 当问题甚至不清楚时,我们似乎有很多解决方案。空白单元格的标准是什么?是从上面的行复制值时吗?如果是这样,行总是按这个顺序排列吗?只是性别是男性吗?

标签: sql-server reporting-services sql-server-2012 group-by ssrs-2012


【解决方案1】:

使用row_number()函数检查重复值并替换为null

SELECT SEX, col1, col2, col3, 
       case when row_number() over (partition by A1 order by SEX) > 1 then null else A1 end A1,
       case when row_number() over (partition by A2 order by SEX) > 1 then null else A2 end A2 
FROM Table1

【讨论】:

    【解决方案2】:

    我的答案取决于一个 Id 列来区分所有记录。我正在使用 LAG SQL 函数来实现所需的输出:

    declare @table1 table (
        id int identity(1,1),
        sex varchar(10),
        col1 int,
        col2 int,
        col3 int,
        A1 int,
        A2 int
    )
    
    insert into @table1 (sex, col1, col2, col3, A1, A2)
    select 'Female',0,0,0,27,83 union all
    select 'Male',1,0,8,27,83 union all
    select 'Female',0,0,0,6,3 union all
    select 'Male',0,0,1,6,3
    
    select sex,col1,col2,col3,
        A1 = (case when lag(A1,1,0) over (order by id) = A1 then null else A1 end),
        A2 = (case when lag(A2,1,0) over (order by id) = A2 then null else A2 end)
    from @Table1
    

    【讨论】:

      【解决方案3】:

      您可以通过IIF 实现这一目标。根据您要保留A1 and A2 的值进行查询,其中col1, col2, col3 为0,否则设置为空白

      SELECT 
          SEX, col1, col2, col3
          , A1 = iif(col1 + col2 + col3 = 0, cast(A1 as varchar(20)), '')
          , A2 = iif(col1 + col2 + col3 = 0, cast(A2 as varchar(20)), '')
      FROM 
          Table1
      

      【讨论】:

        【解决方案4】:

        试试这个

        Declare @table  Table 
            (
              SEX nvarchar(max), 
              col1 int, 
              col2 int, 
              col3 int, 
              A1 int, 
              A2 int 
            )
        
        INSERT into @table (SEX, col1, col2, col3,A1,A2)
        values 
            ('Female', '0', '0', '0','27','83'),
            ('Male', '1', '0', '8','27','83'),
            ('Female', '0', '0', '0','6','3'),
            ('Male', '0', '0', '1','6','3')
        
          Select 
          SEX, col1, col2, col3,
          case  when col3=('8') or col3=('1')  then null else A1 end [A1],
          case  when col3=('8') or col3=('1')then null else A2 end [A2]
          From @table 
        
        SEX    |col1 |col2 |col3 |A1   |A2
        -----------------------------------
        Female |0    |0    |0    |27   |83
        Male   |1    |0    |8    |NULL |NULL
        Female |0    |0    |0    |6    |3
        Male   |0    |0    |1    |NULL |NULL
        

        【讨论】:

          【解决方案5】:

          这些都是非常复杂的解决方案。您只需要将报表中字段上的HideDuplicates属性(在other下)设置为数据集的名称

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多