使用日期的数据透视表

时间:2014-10-08 14:46:52

标签: sql sql-server

我有一个包含以下字段的视图......

 ConID int
 Task varchar
 MeasureCategory varchar
 State char(2)
 DueDate datetime,
 Frequency char(1)
 Pattern char(1)
 TargetMin decimal
 TargetMax decimal
 Achieved decimal

使用ConID,State和DueDate的变量,我想创建一个数据透视表,按月给出TargetMin,TargetMax和Achieved的平均值,用于到期日变量的月份值加上从该变量开始的前四个月中的每一个。因此,如果结束日期变量值为9/30/2014,我希望DueDate时间帧的值为......

 9/1/2014 - 9/30/2014
 8/1/2014 - 8/31/2014
 7/1/2014 - 7/31/2014
 6/1/2014 - 6/30/2014

它也必须是为ConID和State输入的变量值。

所有三个变量ConID,State和DueDate都将发生变化。因此,对于指定状态下的给定ConID,我希望过去四个月的TargetMin,TargetMax和Achieved的平均值以截止为DueDate输入的变量值结束。 每个月内可以有多个条目。数据可以按周输入,也可以按月输入。这就是我想要平均值的原因。

我不熟悉数据透视表,也不知道从哪里开始。

我需要看到的是......

 -____----------------------------------------- MONTH 1 VALUES___________________ = MONTH 2 VALUES________________ - MONTH 3 VALUES___________________ - MONTH 4 VALUES____________________
 Task - MeasureCategory - Frequency - Pattern - TargetMin - TargetMax - Achieved - TargetMin - TargetMax - Achieved - TargetMin - TargetMax - Achieved - TargetMin - TargetMax - Achieved

2 个答案:

答案 0 :(得分:0)

我想给你一个关于how to use PIVOT and UNPIVOT in sql-server(technet.microsoft.com)的链接,而不是为你做的工作,它有一些基本用法的例子。此外,如果您在互联网上搜索,您会发现大量关于在StackOverflow上使用PIVOT的示例。

如果你需要动态PIVOT,请从StackOverflow.com取this example

答案 1 :(得分:0)

此处输入是duedate,它是日期时间,CTE计算以duedate结尾的月份的开始和结束。 如果我们有月份范围,则Group By 4个月每月的截止日期将为您提供平均值。

declare @duedate datetime = '6/30/2014'
declare @conId int = 100
declare @state char(2) = 'ab'

;with CTE(monthend, monthstart, N)
as
( select DATEADD(MONTH, 0, @duedate) as monthend,  
         DATEADD(MONTH,datediff(MONTH, 0, @duedate),0) as monthstart,  1 
  UNION ALL
  select DATEADD(MONTH,1, monthend) as monthend,
         DATEADD(MONTH,datediff(MONTH, 0, DATEADD(MONTH,1, monthend)),0) as monthstart , N+1
  FROM CTE
  where N <=3
 )
select ConId,
       AVG(TargetMin), 
       AVG(TargetMax),
       AVG(Achieved),
       DATEADD(MONTH,datediff(MONTH, 0, DueDate),0) 
from tableA
JOIN CTE
on  DueDate between cte.monthstart and cte.monthend
and conId = @conId
and State = @State
group by ConId,DATEADD(MONTH,datediff(MONTH, 0, DueDate),0)