Sql server 行到列RDLC
我有以下格式的数据。这些数据是通过SQL查询得到的 我想通过查询或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 @
您可以将此结果添加到临时表中 然后添加一列,该列将作为该临时表的引用 然后使用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雷的列引用的更多内容,然后添加一个答案来解释更多。