2016-03-22 23 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 

私の問題は今、それはこのように表示されていることです、私はASP.net 4.6.1を使用してい

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

Microsoft SQL Server

興味のある方はデータベースデザインの写真を添付し​​ます。

Microsoft SQL Database Photo

私は、動的に各従業員のために列を追加するには、SQLクエリに焦点を当てるべき、または私はなど、この設計では、それを表示するには、リストビューテンプレートを使用すべきか?

ご協力いただきありがとうございます。私はこのコミュニティから多くの恩恵を受けました。 :)

編集: (そしておそらくこれはあなたが少し良く私の質問を理解するのに役立ちます)私は私の問題の解決策を得ている最も近いが、この擬似コードです:

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); 

私はこれが誰かの役に立てば幸い:

ここで私はその助けを借りて作られたクエリがあります。 :)