Ряды в столбцы RDLC - PullRequest
       8

Ряды в столбцы RDLC

0 голосов
/ 28 августа 2018

У меня есть данные в формате ниже. эти данные поступают через SQL-запрос. enter image description here

Я хочу показать его в формате ниже по запросу или по отчету rdlc. enter image description here

Ответы [ 4 ]

0 голосов
/ 28 августа 2018

Для этого нужно использовать динамический SQL.

Исходя из ожидаемого результата, вы можете попытаться выполнить этот шаг.

  1. используйте функцию row_number для создания номера строки по имени, потому что нам нужно join основываться на этом номере строки.

  2. получить использование MAX и MIN для создания таблицы календаря с номерами строк. от 1 до max(rn). таблица может позволить использовать outer join

  3. объявляет переменную @tables, чтобы заставить OUTER JOIN выполнять SQL (каждый LEFT JOIN может содержать группу Crew#).

  4. объявите переменную @col для создания столбца, который вы хотите выбрать (Сотрудник) из каждой таблицы.

  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

0 голосов
/ 28 августа 2018

Использование динамического PIVOT, если у вас нет набора столбцов Crew.

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)

Output

0 голосов
/ 28 августа 2018
  1. креатин tbale

Сначала мы создадим временную таблицу, в которой мы будем хранить данные, которые у вас есть, и вашу таблицу

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

INsert into #table1
values (....)
select * from #table1

enter image description here

  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)

таким образом, мы получим только первую строку для каждого столбца поэтому мы должны найти способ агрегировать и получить другие столбцы, чтобы продемонстрировать, что я объединю Ммин, и здесь я остановил свои яички, но вы можете сделать больше, чем это, с некоторыми яичками

enter image description here

теперь объединение:

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)

вот результат:

enter image description here

если вы пойдете этим путем, я уверен, что вы найдете способ объединить все результаты

0 голосов
/ 28 августа 2018

Вы можете добавить этот результат во временную таблицу затем добавьте столбец, который будет ссылкой в ​​эту временную таблицу затем используйте функцию поворота

Чтобы узнать больше о сводном посещении: https://msdn.microsoft.com/en-us/azure/data-lake-analytics/u-sql/pivot-and-unpivot-u-sql

Вы также можете использовать SSIS для очень удобного и простого в использовании инструмента

...