我正在开发一个appliaction,我有一个以下架构
TASK_ID
Task_Name
TASK_ID
Task_Date
Task_Count(可以是任何数字,如2或3或4或40)
输入表格就像工作人员在当天结束时填写的那样。
24/01/2010 |今天发行了多少本支票簿12个
24/01/2010 |今天发布了多少ATM? 7
现在我想要一个矩阵报告,显示所有任务假设垂直行中的28个任务,并且在给定月份它应该显示特定月份水平方向的所有日期,例如1到31天或30或28个月的日期task_count在查询中使用PIVOT。我没有产生结果,因为我不知道让它工作。请帮忙。
感谢
答案 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)