SQLServer Pivot查询

时间:2010-11-05 06:57:14

标签: sql-server-2008

我正在开发一个appliaction,我有一个以下架构

任务大师

TASK_ID
Task_Name

Task_Details

TASK_ID
Task_Date
Task_Count(可以是任何数字,如2或3或4或40)

输入表格就像工作人员在当天结束时填写的那样。

日期|任务名称| Task_Count

24/01/2010 |今天发行了多少本支票簿12个
24/01/2010 |今天发布了多少ATM? 7

现在我想要一个矩阵报告,显示所有任务假设垂直行中的28个任务,并且在给定月份它应该显示特定月份水平方向的所有日期,例如1到31天或30或28个月的日期task_count在查询中使用PIVOT。我没有产生结果,因为我不知道让它工作。请帮忙。

感谢

1 个答案:

答案 0 :(得分:0)

您需要使用动态查询,因为数据透视表返回的列每个月都会更改。

有一段时间,这可能会变得更优雅,但这是基本的想法:

declare @StartOfMonth datetime = '11/1/2010';
declare @counter datetime = @StartOfMonth;
declare @sql varchar(MAX) = '';
declare @columnnames varchar(MAX);
declare @columnfilter varchar(MAX);
declare @fieldname varchar(12);

--First, create a string of dynamic columns, one for each day of the month.
WHILE (MONTH(@counter) = MONTH(@StartOfMonth))
BEGIN

    SET @fieldname = '[' + CONVERT(varchar(10), @counter, 101) + ']';

    --Wrap the columns in ISNULL(@,0) to avoid having null values for days without tasks.
    SET @columnnames = ISNULL(@columnnames + ',', '') + 'ISNULL(' + @fieldname + ',0) AS ' + @fieldname;

    --Also create a dynamic list of the Task_Date values to include in the pivot.
    SET @columnfilter = ISNULL(@columnfilter + ',', '') + @fieldname;


    SET @counter = DATEADD(DAY,1,@counter);
END

--Put it all together into a pivot query.
set @sql = 'SELECT Task_Name, ' + @columnnames + ' FROM (';
set @sql = @sql + 'SELECT M.Task_Name, D.Task_Date, D.Task_Count '
set @sql = @sql + 'FROM Task_Detail D JOIN Task_Master M ON D.Task_ID = M.Task_ID) as SourceTable ';
set @sql = @sql + 'PIVOT (SUM(Task_Count) FOR Task_Date IN (' + @columnfilter + ')) AS PivotTable';

exec (@sql)