3

頭をカーソルに巻き付けるのに少し助けが必要です。

私はaspxレポートを作成しました、それは非常に簡単でした。プロジェクトごとに、研究、開発、社内で何時間かかったかを確認する必要がありました。最初のものは非常に単純で、3つのグループと等しい3つのタイプの時間でソリューションをハードコーディングしました。上司はそれが素晴らしいレポートだと思ったので、すべての顧客をカバーするようにしたかったのです。残念ながら、次の顧客には5つのグループがあり、各グループにはそれぞれ2〜7種類の時間がありました。

ここで、グループを指定(完了)し、各グループにどのタイプの時間を入れるか(完了)を指定できる動的なソリューションが必要です。最後に、これら2つを、費やした時間を記録するテーブルと組み合わせる必要があります。

プロジェクト、時間の種類、この時間グループ内で費やされた時間を一覧表示できる基本的なカーソルがあります。

私が持っているのは:
プロジェクト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

DECLARE @iTimeTypeGroupID int

DECLARE cur CURSOR LOCAL READ_ONLY
にとって
SELECT iRefTimeTypeGroupID
FROM tbl_TimeTypeGrouping
WHERE iRefCustomerID = @customerID

OPEN cur

次のフェッチからcur
INTO @iTimeTypeGroupID

WHILE @@ FETCH_STATUS = 0
始める
    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)
    PT.iRefProjectIDによるグループ化
        、PT.iRefTimeTypeID

    次のフェッチからcur
    INTO @iTimeTypeGroupID
終わり

curを閉じる
カーの割り当てを解除
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 に答える