动态内容中的SQL游标

时间:2013-01-21 13:35:52

标签: sql-server sql-server-2005 dynamic cursor

我需要一点帮助把我的头包裹在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

1 个答案:

答案 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)

参考文献: