我有一个包含以下字段的视图......
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
答案 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)