Sql server 行到列RDLC

Sql server 行到列RDLC,sql-server,rdlc,dynamic-sql,qsqlquery,Sql Server,Rdlc,Dynamic Sql,Qsqlquery,我有以下格式的数据。这些数据是通过SQL查询得到的 我想通过查询或rdlc报告以以下格式显示它。 您可以将此结果添加到临时表中 然后添加一列,该列将作为该临时表的引用 然后使用pivot函数 要了解有关pivot的更多信息,请访问: 如果您没有设置组列,还可以使用SSIS作为一个非常方便的工具,并使用dynamic PIVOT轻松使用 DECLARE @ColumnString VARCHAR(256) DECLARE @ColumnHeadrer VARCHAR(256) DECLARE @

我有以下格式的数据。这些数据是通过SQL查询得到的

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

您可以将此结果添加到临时表中 然后添加一列,该列将作为该临时表的引用 然后使用pivot函数

要了解有关pivot的更多信息,请访问:


如果您没有设置组列,还可以使用SSIS作为一个非常方便的工具,并使用dynamic 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)
肌酸丁酯 首先,我们将创建一个临时表,在其中存储您拥有的数据和您的表

    create table #table1 
(
[Crew Name] varchar(500) , 
Employee varchar(500) 
)

INsert into #table1
values (....)
select * from #table1
动态选择 然后我们将创建一个动态查询来获取我们拥有的列,这样我们就可以添加任意数量的工作人员

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来实现它

根据你的预期结果,你可以试着按照这些步骤去做

使用row_number函数按名称生成row_number,因为我们需要基于该row_number进行连接

获取使用最大值和最小值生成行数日历表。从1到maxrn。该表允许使用外部联接

声明一个var@tables,使外部连接执行SQL每个左连接都有一组成员

声明一个var@col以生成列,您希望从每个表中选择该列的Employee

然后使用executedynamic执行它

像这样

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)

你能告诉我们到目前为止你尝试了什么,也许我们可以从那里开始我尝试使用pivot,但它带有聚合,所以当我使用min或max时,它只为每个组员显示一行…我也对RDLC开放。如果有人可以帮助创建具有所需格式的rdlc报告。我也尝试过,但同样的问题是,当我在列中放入Crew,在值中放入empName时,我必须选择一些聚合函数,然后它也将只显示1行。如果每个组的最大员工数是固定的且很小,那么就不需要动态解决方案。Crew是动态的。所以我无法修复它们,如果你给我你的表结构和数据,我将为你创建一个动态数据透视图,我在这里展示的输出来自许多表。您可以使用此输出作为初始输入。考虑到这两个列是提供数据的表。Hi @ Shahid我编辑了我的脚本,所以现在它动态拾取乘员栏。请您解释一下关于Tabp Tab雷的列引用的更多内容,然后添加一个答案来解释更多。