我需要一点帮助来了解 CURSOR。
我做了一个aspx报告,很简单。对于每个项目,我需要查看研究、开发和内部进行了多少小时。第一个非常简单,我只是用 3 个组和相等的 3 种时间对解决方案进行了硬编码。老板认为这是一份出色的报告,因此他希望它涵盖所有客户。不幸的是,下一个客户有 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
问题是,我需要报告
头____A组|B组|C组|N组
项目 A -|- 5 -|- 1 -|- 0 -|- x
项目 B -|- 2 -|- 10 -|- 3 -|- y
项目 C -|- 10 -|- 2 -|- 7 -|- z
声明 @iTimeTypeGroupID int
声明当前光标本地只读
为了
选择 iRefTimeTypeGroupID
FROM tbl_TimeTypeGrouping
哪里 iRefCustomerID = @customerID
开路
从 cur 中获取下一个
INTO @iTimeTypeGroupID
而@@FETCH_STATUS = 0
开始
选择 PT.iRefProjectID
, PT.iRefTimeTypeID
, SUM(PT.decNumberOfHours) sumNumberOfHours
从 tbl_ProjectTransaction PT
其中 iRefTimeTypeID 位于 (
选择 iRefTimeTypeID
FROM tbl_TimeTypeGrouping
哪里 iRefTimeTypeGroupID = @iTimeTypeGroupID
和 iRefCustomerID = @customerID)
按 PT.iRefProjectID 分组
, PT.iRefTimeTypeID
从 cur 中获取下一个
INTO @iTimeTypeGroupID
结尾
关闭电流
释放当前
最佳答案
我不确定列名。所以在这个例子中,我希望 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)
引用:
关于sql-server - 动态内容中的 SQL 游标,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14439866/