0

SSRS 2005 を使用してレポートを作成し、さまざまなカテゴリ (登録時間、残業など) の時間の合計を表示しています。

SELECT OGL.PACostCenter, vpt.LL6, sum((vpt.timeinseconds*1.0)/3600) [Hours]
FROM totals as vpt
INNER JOIN OracleLookup OGL on vpt.LL6 = OGL.OracleCostCenter COLLATE SQL_Latin1_General_CP1_CI_AI
WHERE vpt.DATE BETWEEN @StartDate AND @EndDate
AND vpt.PAYCODENAME in ('519-H-Overtime 1.0',
            '519-H-Holiday OT 1.5',
            '519-H-Overtime 1.5',
            '519-H-Overtime 2.0',
            '519-H-Regular')
GROUP BY OGL.PayrollAccount, vpt.LL6
ORDER BY  OGL.PayrollAccount, vpt.LL6

合計時間は問題ありませんが、それを分解して、残業のみ、通常の時間のみ、およびすべての合計の列を作成できるようにしたいと考えています。誰もが知っている簡単でクリーンな方法はありますか? 別のデータ セットを使用してみましたが、期待したとおりに動作しませんでした。また、サブクエリのようなものは、非常に面倒で冗長になるように思われました。

4

3 に答える 3

2

はい、条件付き合計を使用できます。

SELECT OGL.PACostCenter, vpt.LL6, sum((vpt.timeinseconds*1.0)/3600) [Hours],
       sum(case when vpt.PAYCODENAME in ('519-H-Overtime 1.0', '519-H-Holiday OT 1.5',
                                         '519-H-Overtime 1.5', '519-H-Overtime 2.0'
                                        )
                then (vpt.timeinseconds*1.0)/3600
                else 0
           end) as OvertimeHours,
       sum(case when vpt.PAYCODENAME in ('519-H-Regular')
                then (vpt.timeinseconds*1.0)/3600
                else 0
           end) as RegularHours,
FROM totals as vpt
INNER JOIN OracleLookup OGL on vpt.LL6 = OGL.OracleCostCenter COLLATE SQL_Latin1_General_CP1_CI_AI
WHERE vpt.DATE BETWEEN @StartDate AND @EndDate
AND vpt.PAYCODENAME in ('519-H-Overtime 1.0',
            '519-H-Holiday OT 1.5',
            '519-H-Overtime 1.5',
            '519-H-Overtime 2.0',
            '519-H-Regular')
GROUP BY OGL.PayrollAccount, vpt.LL6
ORDER BY  OGL.PayrollAccount, vpt.LL6;
于 2013-08-19T13:49:16.327 に答える
1

そのデータセット クエリを制御できると仮定すると、次のようなことができるはずです。

SELECT OGL.PACostCenter, vpt.LL6
  , sum((vpt.timeinseconds*1.0)/3600) [Hours] -- your initial total
  , sum(case when vpt.PAYCODENAME = '519-H-Overtime 1.0'
    then vpt.timeinseconds*1.0 else null end) / 3600 [OT1]
  , sum(case when vpt.PAYCODENAME = '519-H-Overtime 1.5'
    then vpt.timeinseconds*1.0 else null end) / 3600 [OT1pt5]
  -- further SUM/CASE as required
FROM totals as vpt
INNER JOIN OracleLookup OGL on vpt.LL6 = OGL.OracleCostCenter COLLATE SQL_Latin1_General_CP1_CI_AI
WHERE vpt.DATE BETWEEN @StartDate AND @EndDate
AND vpt.PAYCODENAME in ('519-H-Overtime 1.0',
            '519-H-Holiday OT 1.5',
            '519-H-Overtime 1.5',
            '519-H-Overtime 2.0',
            '519-H-Regular')
GROUP BY OGL.PayrollAccount, vpt.LL6
ORDER BY  OGL.PayrollAccount, vpt.LL6

つまり、必要なグループを抽出SUMするステートメントに適用します。CASE

于 2013-08-19T13:51:23.767 に答える
0

SSRSを使用しているので、このようにすることをお勧めします

SELECT OGL.PACostCenter, vpt.PAYCODENAME, vpt.LL6, sum((vpt.timeinseconds*1.0)/3600) [Hours]
FROM totals as vpt
INNER JOIN OracleLookup OGL on vpt.LL6 = OGL.OracleCostCenter COLLATE SQL_Latin1_General_CP1_CI_AI
WHERE vpt.DATE BETWEEN @StartDate AND @EndDate
AND vpt.PAYCODENAME in ('519-H-Overtime 1.0',
        '519-H-Holiday OT 1.5',
        '519-H-Overtime 1.5',
        '519-H-Overtime 2.0',
        '519-H-Regular')
GROUP BY OGL.PayrollAccount, vpt.PAYCODENAME, vpt.LL6
ORDER BY  OGL.PayrollAccount, vpt.LL6

これにより、各タイプ(通常、残業など)の合計が得られ、レポートに合計が作成されます

于 2013-08-19T13:51:16.130 に答える