我需要一点帮助把我的头包裹在CURSOR周围。
我做了一个aspx报告,很简单。对于每个项目,我需要查看研究,开发和内部的小时数。第一个很简单,我只用3组和3种类型的时间硬编码解决方案。 Boss认为这是一份精彩的报告,所以他希望它涵盖所有客户。不幸的是,下一个客户有5个小组,每组有2-7种不同的时间。
现在我需要一个动态解决方案,我可以指定组(完成)并指定每个组(完成)的时间类型,最后我需要将这两个时间与记录花费时间的表结合起来。
我有一个基本光标,我可以列出项目,时间类型以及在这组时间内花费的时间。
我拥有的是:
项目A - | - A组 - | - 5
项目B - | - A组 - | - 2
项目C - | - A组 - | - 10
项目A - | - B组 - | - 1
项目B - | - B组 - | - 10
项目C - | - B组 - | - 2
项目A - | - C组 - | - 0
项目B - | - C组 - | - 3
项目C - | - C组 - | - 7
问题是,我需要报告为
Header____ A组| B组| C组| N组
项目A - | - 5 - | - 1 - | - 0 - | - x
项目B - | - 2 - | - 10 - | - 3 - | - y
项目C - | - 10 - | - 2 - | - 7 - | - z
DECLARE @iTimeTypeGroupID int DECLARE cur CURSOR LOCAL READ_ONLY FOR SELECT iRefTimeTypeGroupID FROM tbl_TimeTypeGrouping WHERE iRefCustomerID = @customerID OPEN cur FETCH NEXT FROM cur INTO @iTimeTypeGroupID WHILE @@FETCH_STATUS = 0 BEGIN SELECT PT.iRefProjectID , PT.iRefTimeTypeID , SUM(PT.decNumberOfHours) sumNumberOfHours FROM tbl_ProjectTransaction PT WHERE iRefTimeTypeID IN ( SELECT iRefTimeTypeID FROM tbl_TimeTypeGrouping WHERE iRefTimeTypeGroupID = @iTimeTypeGroupID AND iRefCustomerID = @customerID) GROUP BY PT.iRefProjectID , PT.iRefTimeTypeID FETCH NEXT FROM cur INTO @iTimeTypeGroupID END CLOSE cur DEALLOCATE cur
答案 0 :(得分:2)
我不确定列名。因此,在此示例中,我希望tbl_ProjectTransaction
有一个名为projectName
的列和tbl_TimeTypeGrouping
有一个GroupName
。就像在问题中被称赞的人一样,在这种情况下你不应该使用光标。您应该使用动态轴。这是一个例子:
获取这样的组名称:
DECLARE @cols VARCHAR(MAX)
SELECT @cols=STUFF
(
(
SELECT
',' +QUOTENAME(tbl_TimeTypeGrouping.sGroupName) -- ????
FROM
tbl_TimeTypeGrouping
FOR XML PATH('')
)
,1,1,'')
这会给你:
'[Group A],[Group B],[Group C],[Group N]'
然后像这样做一个动态支点:
DECLARE @query NVARCHAR(4000)=
N'SELECT
*
FROM
(
SELECT
tbl_ProjectTransaction.sProjectName, -- ????
tbl_ProjectTransaction.decNumberOfHours,
tbl_TimeTypeGrouping.sGroupName -- ???
FROM
tbl_ProjectTransaction
JOIN tbl_TimeTypeGrouping
ON tbl_ProjectTransaction.iRefTimeTypeID=tbl_TimeTypeGrouping.iRefTimeTypeID
) AS SourceTable
PIVOT
(
SUM(decNumberOfHours)
FOR GroupName IN ('+@cols+')
) As Pvt'
EXECUTE(@query)
参考文献: