Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net SQL交叉制表,透视_Asp.net_Sql Server_Pivot - Fatal编程技术网

Asp.net SQL交叉制表,透视

Asp.net SQL交叉制表,透视,asp.net,sql-server,pivot,Asp.net,Sql Server,Pivot,我在一家需要改进轮班管理概述的公司工作。他们习惯于excel表格,我打算在web浏览器上实现一个解决方案。工作表的格式如下所示: Employee1 Employee2 Employee3 DD/MM/YYY1 Mon Shift1 Shift2 Shift3 DD/MM/YYY2 Tue Shift2 Shift3 Shift1 DD/MM/YYY3 Wed Shift3 Sh

我在一家需要改进轮班管理概述的公司工作。他们习惯于excel表格,我打算在web浏览器上实现一个解决方案。工作表的格式如下所示:

                 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 
我的问题是,现在看起来是这样的:

                 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

我会附上一张数据库设计的照片给那些感兴趣的人

我应该关注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]

我知道在SQL server中,FOR EACH不是一个选项,但希望这描述了我试图实现的目标。

做了一些额外的研究后,我发现这对解释旋转非常有帮助

以下是我在其帮助下提出的问题:

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

我希望这对某人有帮助。:)

当你说什么是解析数据最有效的方法时,你是在问应该如何导入源数据吗?@destination data实际上,如果你对改进的SQL查询有什么建议,我很乐意听你说!但我不是这个意思。我相信我只需要改进我的查询,然后我就可以在GridView中自动显示它。