行到列 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)
- 创建表格
首先,我们将创建一个临时文件 table,我们将在其中存储您拥有的数据和您的 table
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
函数按名称生成行号,因为我们需要join
基于row_number。
使用MAX
和MIN
制作行号日历table。从 1 到 max(rn)
。 table 可以让使用 outer join
声明一个 var @tables
使 OUTER JOIN
执行 SQL(每个 LEFT JOIN
都是一组 Crew#
)。
声明一个 var @col
来创建列,您希望从每个 table.
[=48 select (Employee) =]
然后使用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)
我有以下格式的数据。此数据来自 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)
- 创建表格
首先,我们将创建一个临时文件 table,我们将在其中存储您拥有的数据和您的 table
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
函数按名称生成行号,因为我们需要join
基于row_number。使用
MAX
和MIN
制作行号日历table。从 1 到max(rn)
。 table 可以让使用outer join
声明一个 var
@tables
使OUTER JOIN
执行 SQL(每个LEFT JOIN
都是一组Crew#
)。声明一个 var
[=48 select (Employee) =]@col
来创建列,您希望从每个 table.然后使用
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)