2016-03-22 147 views
0

我正在爲一家需要改進的班次管理概述的公司工作。他們習慣於Excel工作表,我打算在Web瀏覽器上實現一個解決方案。該表的格式是這樣的:SQL交叉表,數據透視表

    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控件模板在這個設計顯示它,等等?

感謝您的關注和幫助。我從這個社區中受益頗多。 :)

編輯: 我已經得到了解決我的問題(也許這將幫助你理解我的問題好一點)最接近的是這個僞代碼:

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

@ destination-data實際上,如果您對改進的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); 

我希望這可以幫助別人。 :)