行到列 RDLC

Rows to Columns RDLC

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

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

您可以将此结果添加到临时文件中 table 然后添加一列作为此临时文件的参考 table 然后使用枢轴函数

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

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

如果您没有设置 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)

  1. 创建表格

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

    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)

结果如下:

如果您按照这种方式进行操作,我相信您会找到一种合并所有结果的方法

您需要使用动态 SQL 来制作它。

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

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

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

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

  4. 声明一个 var @col 来创建列,您希望从每个 table.

    [=48 select (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