2016-03-22 6 views
0

Я работаю в компании, которая нуждается в улучшенном обзоре управления переключением. Они используются для листа excel, и вместо этого я должен реализовать решение в веб-браузере. Формат листа что-то вроде этого:SQL Cross-Tabulation, Pivot

    Employee1 Employee2 Employee3 
DD/MM/YYY1 Mon Shift1  Shift2  Shift3 
DD/MM/YYY2 Tue Shift2  Shift3  Shift1 
DD/MM/YYY3 Wed Shift3  Shift1  Shift2 
DD/MM/YYY4 Thu Shift1  Shift2  Shift3 
DD/MM/YYY5 Fri Shift2  Shift3  Shift1 

Моя проблема заключается в том, что сейчас, по-видимому, как это:

Date   Shift_Type_Name Employee_Name 
DD/MM/YYY1 Mon Shift1   Employee1 
DD/MM/YYY1 Mon Shift2   Employee2 
DD/MM/YYY1 Mon Shift3   Employee3 

Я использую ASP.net 4.6.1, и Microsoft SQL Server.

Прилагаю фотографию дизайна базы данных для заинтересованных.

Microsoft SQL Database Photo

Должен ли я сосредоточиться на SQL запросе динамически добавить столбец для каждого сотрудника, или я должен использовать ListView шаблоны, чтобы отобразить его в этом проекте, и т.д.?

Спасибо за ваш интерес и помощь. Я много выиграл от этого сообщества. :)

Edit: Ближайший я получил к решению моей проблемы (и, возможно, это поможет вам понять мой вопрос немного лучше) это псевдокод:

SELECT 
[Date].[date] AS 'Date', 
FOR EACH(SELECT [Employee].* AS THIS){ 
    SELECT [Shift_Type].[name] AS [THIS].[Name] + ' Morning', 
     WHERE [Shifts].[Type] = @morning_hours AND [Shifts].[Employee_fk] = [THIS].[ID] 
    SELECT [Shift_Type].[name] AS [THIS].[Name] + ' Evening', 
     WHERE [Shifts].[Type] = @evening_hours AND [Shifts].[Employee_fk] = [THIS].[ID] 
    } 
FROM [Groups] 
JOIN [Employee] 
    ON [Groups].[id] = [Employee].[group_fk] 
JOIN [Shifts] 
    ON [Employee].[id] = [Shifts].[employee_fk] 
JOIN [Shift_Types] 
    ON [Shift_Types].[id] = [Shifts].[type_fk] 
RIGHT JOIN [Date] 
    ON [Date].[id] = [Shifts].[date_fk] 
JOIN [Public_Holidays] 
    ON [Public_Holidays].[date_fk] = [Date].[id] 

Я понимаю что FOR EACH не является вариантом на SQL-сервере, но, надеюсь, это описывает то, что я пытаюсь достичь.

+0

Когда вы говорите * Что является наиболее эффективным способом анализа данных *, вы спрашиваете, как импортировать исходные данные? –

+0

@ данные назначения Фактически, если у вас есть предложение по улучшенному SQL-запросу, я бы с удовольствием его услышал! Это было не то, что я имел в виду, хотя. Я убежден, что мне просто нужно улучшить свой запрос, а затем я могу отображать его в GridView автоматически. – LiHRaM

ответ

0

Проведя некоторые дополнительные исследования, я нашел this video, чтобы быть очень полезным в объяснении поворота.

Вот запрос я сделал с его помощью:

DECLARE @ColumnNames NVARCHAR(MAX) = ''; 
DECLARE @SQuery NVARCHAR(MAX) = ''; 

SELECT @ColumnNames += QUOTENAME(Employee.name) + ',' 
FROM Employee; 

SET @ColumnNames =LEFT(@ColumnNames, LEN(@ColumnNames) - 1); 


SET @SQuery = 
' 
SELECT * FROM 
    (SELECT 
    Employee.name as Name, 
    Date.date as ''Date'', 
    Shift_Types.name as ''Shift'' 
FROM [Groups] 
    JOIN [Employee] 
     ON [Groups].[id] = [Employee].[group_fk] 
    JOIN [Shifts] 
     ON [Employee].[id] = [Shifts].[employee_fk] 
    JOIN [Shift_Types] 
     ON [Shift_Types].[id] = [Shifts].[type_fk] 
    RIGHT JOIN [Date] 
     ON [Date].[id] = [Shifts].[date_fk] 
    JOIN [Public_Holidays] 
     ON [Public_Holidays].[date_fk] = [Date].[id]) as BaseData 
PIVOT(
    MIN(BaseData.[Shift]) 
    FOR BaseData.[Name] 
    IN (' + @ColumnNames + ') 
) as PivotTable' 

EXEC(@SQuery); 

Я надеюсь, что это поможет кому-то. :)