这种类型的查询(将行中的值转换为列)被命名为数据透视查询(SQL Server)或交叉表(Access)。
有两种类型的枢轴的查询(一般来说):
- 使用固定数量的列。
- 具有动态数量的列。
SQL Server支持两种类型的但:
- 数据库引擎(查询语言:T-SQL)支持仅直接枢轴 查询具有固定数量的列(1)和间接(2)
的
- 分析服务(查询语言:MDX)直接支持这两种类型(1 & 2)。 另外,您可以使用OPENQUERY/OPENROWSET函数或使用具有四部分名称的链接服务器从T-SQL查询(MDX)Analysis Service数据源。
T-SQL(只)解决方案:
对于第一类(1),从SQL Server 2005中您可以使用PIVOT操作:
SELECT pvt.*
FROM
(
SELECT Date, Id, Status_ID, Status_Time
FROM Table
) src
PIVOT (SUM(src.Status_Time) FOR src.Status_ID IN ([1], [2], [3])) pvt
或
SELECT pvt.Date, pvt.Id, pvt.[1] AS Lunch, pvt.[2] AS [Break], pvt.[3] Vacation
FROM
(
SELECT Date, Id, Status_ID, Status_Time
FROM Table
) src
PIVOT (SUM(src.Status_Time) FOR src.Status_ID IN ([1], [2], [3])) pvt
对于动态数量的列(2),T-SQL仅提供间接解决方案:动态查询。首先,您必须从Status_ID中找到所有不同的值,然后下一步是构建最终查询:
DECLARE @SQLStatement NVARCHAR(4000)
,@PivotValues NVARCHAR(4000);
SET @PivotValues = '';
SELECT @PivotValues = @PivotValues + ',' + QUOTENAME(src.Status_ID)
FROM
(
SELECT DISTINCT Status_ID
FROM Table
) src;
SET @PivotValues = SUBSTRING(@PivotValues,2,4000);
SELECT @SQLStatement =
'SELECT pvt.*
FROM
(
SELECT Date, Id, Status_ID, Status_Time
FROM Table
) src
PIVOT (SUM(src.Status_Time) FOR src.Status_ID IN ('[email protected]+')) pvt';
EXECUTE sp_executesql @SQLStatement;
您是否使用合并表和一些临时表来分段数据? –
我没有。我现在会研究这一点。谢谢。 – Jessica