【问题标题】:Rows to Columns RDLC行到列 RDLC
【发布时间】:2019-02-02 20:23:07
【问题描述】:

我有以下格式的数据。此数据来自 SQL 查询。

我想通过查询或 rdlc 报告以以下格式显示它。

【问题讨论】:

  • 你能告诉我们你到目前为止做了什么,也许我们可以从那里开始
  • 我尝试使用枢轴,但它带有聚合,因此当我使用最小或最大时,它只为每个工作人员显示 1 行...
  • 我也对 RDLC 持开放态度。如果有人可以帮助创建具有所需格式的 rdlc 报告。我也尝试过,但同样的问题是,当我将 Crew # 放在列中并将 empName 放在值中时,我必须选择一些聚合函数,然后它也只会显示 1 行。
  • 如果每组的最大员工人数是固定的(并且很小),则不需要动态解决方案。

标签: sql-server rdlc dynamic-sql qsqlquery


【解决方案1】:

你需要使用动态SQL来制作。

根据您的预期结果,您可以尝试按照这些步骤进行操作。

  1. 使用row_number函数按名称生成行号,因为我们需要join基于该行号。

  2. 获取使用MAXMIN制作行号日历表。从 1 到 max(rn)。该表可以让使用outer join

  3. 声明一个 var @tables 以使 OUTER JOIN 执行 SQL(每个 LEFT JOIN 和一组 Crew#)。

  4. 声明一个 var @col 来创建列,您想从每个表中选择 (Employee)。

  5. 然后使用execute动态执行。

看起来像这样。

create table T
(
    Name varchar(50),
    Employee VARCHAR(50)
)

insert into T values ('Crew#1','TR123');
insert into T values ('Crew#1','311');
insert into T values ('Crew#2','DDD');
insert into T values ('Crew#2','12121');
insert into T values ('Crew#1','SDDAS');
insert into T values ('Crew#3','31114312');
insert into T values ('Crew#3','DD14124D');
insert into T values ('Crew#3','1214124121');
insert into T values ('Crew#3','SDD412AS');


DECLARE @tables AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX),
        @col AS NVARCHAR(MAX);



SET @tables = STUFF((SELECT distinct ' LEFT JOIN ' + ' (SELECT * FROM CTE WHERE Name = '''+Name+''') '+QUOTENAME(Name)+' on t1.smallRN = '+QUOTENAME(Name)+'.rn' 
            FROM T
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


SET @col = STUFF((SELECT distinct ', ' + QUOTENAME(Name)+'.Employee as '''+ QUOTENAME(Name) +''''
            FROM T
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

SET @col = substring(@col,1, len(@col))

set @query = '
WITH CTE AS (
    SELECT *,ROW_NUMBER() OVER(PARTITION BY Name ORDER BY Name) rn
    FROM T 
),CTE1 AS(
    SELECT MIN(rn) smallRN,MAX(rn) bigRN
    FROM CTE 
    UNION ALL
    SELECT smallRN+1,bigRN
    FROM CTE1
    WHERE smallRN < bigRN
)
SELECT '+@col+' 
FROM CTE1 t1 ' + @tables

execute(@query)

sqlfiddle

【讨论】:

    【解决方案2】:
    1. 肌酐

    首先,我们将创建一个临时表,我们将在其中存储您拥有的数据和您的表

        create table #table1 
    (
    [Crew Name] varchar(500) , 
    Employee varchar(500) 
    )
    
    INsert into #table1
    values (....)
    select * from #table1
    

    1. 动态选择

    然后我们将创建一个动态查询来获取我们拥有的列,这样我们就可以添加尽可能多的工作人员,

    declare @DynamicPivotQuery as nvarchar(max)
    declare @ColumnName as nvarchar(max)
    
    select @ColumnName = ISNULL(@ColumnName +',','') + QUOTENAME([Crew Name])
    from (select distinct [Crew Name] from #table1) as Country
    
    set @DynamicPivotQuery = N'select ' +@ColumnName + '
                                from #table1 
                                  Pivot ( MAX(Employee)
                                    FOR [Crew Name] in (' +@ColumnName+')) as Pivoted 
    
                                '
    exec (@DynamicPivotQuery)
    

    这样我们将只得到每一列的第一行 所以我们必须找到一种方法来聚合并获取其他列,以证明我将联合 Mmin 这也是我停止我的睾丸的地方,但你可以用一些睾丸做更多的事情

    现在是工会:

    declare @DynamicPivotQuery as nvarchar(max)
    declare @ColumnName as nvarchar(max)
    
    select @ColumnName = ISNULL(@ColumnName +',','') + QUOTENAME([Crew Name])
    from (select distinct [Crew Name] from #table1) as Country
    
    set @DynamicPivotQuery = N'select ' +@ColumnName + '
                                from #table1 
                                  Pivot ( MAX(Employee)
                                    FOR [Crew Name] in (' +@ColumnName+')) as Pivoted 
                                    union 
                                    select ' +@ColumnName + '
                                        from #table1 
                                         Pivot ( MIN(Employee)
                                         FOR [Crew Name] in (' +@ColumnName+')) as Pivoted
                                '
    
    exec (@DynamicPivotQuery)
    

    结果如下:

    如果你遵循这种方式,我相信你会找到一种方法来合并所有结果

    【讨论】:

      【解决方案3】:

      您可以将此结果添加到临时表中 然后添加一列作为该临时表的引用 然后使用枢轴功能

      要了解有关枢轴访问的更多信息: https://msdn.microsoft.com/en-us/azure/data-lake-analytics/u-sql/pivot-and-unpivot-u-sql

      您也可以将 SSIS 用作一个非常方便且易于使用的工具

      【讨论】:

      • 你能解释一下关于临时表的列引用吗
      • 我会添加一个答案来解释更多
      【解决方案4】:

      如果您没有设置 Crew 列,请使用动态 PIVOT。

      DECLARE @ColumnString VARCHAR(256)
      DECLARE @ColumnHeadrer VARCHAR(256)
      DECLARE @sql varchar(1000)
      
      CREATE TABLE #ColumnValue
      (
          Value VARCHAR(500),
          ColumnHeader VARCHAR(256)
      )
      
      INSERT INTO #ColumnValue (Value, ColumnHeader)
      SELECT DISTINCT '[' + CrewName + ']', 
        'ISNULL(' + CrewName + ','''') AS ' + CrewName 
      FROM CrewTable
      
      SELECT @ColumnString = COALESCE(@ColumnString + ',', '') + Value,
          @ColumnHeadrer = COALESCE(@ColumnHeadrer + ',', '') + ColumnHeader
      FROM #ColumnValue
      
      SET @sql =
      '
      SELECT ' + @ColumnHeadrer + '
      FROM
      (
          SELECT Employee,
              CrewName,
              ROW_NUMBER() OVER(PARTITION BY CrewName ORDER BY CrewName) AS rnk
          FROM CrewTable
      ) AS P
          PIVOT
      (
          MAX(Employee) FOR [CrewName] IN ('+@ColumnString+')
      ) AS pv
      '
      
      
      EXEC (@sql)
      

      【讨论】:

      • 船员编号是动态的。所以我无法修复它们
      • 如果你给我你的表结构和数据,我会为你创建一个动态数据透视
      • 我在这里显示的输出来自许多表。您可以将此输出用作初始输入。考虑这些是表中的两列,其中提供了数据。
      • 嗨@Shahid 我编辑了我的脚本,所以现在它动态拾取船员列。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 1970-01-01
      相关资源
      最近更新 更多