3

我需要一些帮助来解决 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____Group A|Group B|Group C|Group N
Project A -|- 5 -|- 1 -|- 0 -|- x
Project B -|- 2 -|- 10 -| - 3 -|- y
项目 C -|- 10 -|- 2 -|- 7 -|- z

声明 @iTimeTypeGroupID 整数

DECLARE cur CURSOR LOCAL READ_ONLY
为了
选择 iRefTimeTypeGroupID
FROM tbl_TimeTypeGrouping
其中 iRefCustomerID = @customerID

打开当前

从当前获取下一个
INTO @iTimeTypeGroupID

而@@FETCH_STATUS = 0
开始
    选择 PT.iRefProjectID
        , PT.iRefTimeTypeID
        , SUM(PT.decNumberOfHours) sumNumberOfHours
    FROM tbl_ProjectTransaction PT
    iRefTimeTypeID 在哪里(
        选择 iRefTimeTypeID
        FROM tbl_TimeTypeGrouping
        WHERE iRefTimeTypeGroupID = @iTimeTypeGroupID
            和 iRefCustomerID = @customerID)
    按 PT.iRefProjectID 分组
        , PT.iRefTimeTypeID

    从当前获取下一个
    INTO @iTimeTypeGroupID
结尾

关闭当前
解除当前
4

1 回答 1

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)

参考:

于 2013-01-21T13:53:33.173 回答