1

私はSQL Server 2008で次のシナリオを持っています

           **** Original Result ****
================================================
Year   month  Category               Count_days
================================================
2001    09     Leave                   03
2001    09     Worked Below 8hrs       18
2001    09     Worked Above 8hrs       05
2001    09     Present                  0  <----- current value
2001    10     Leave                   01
2001    10     Worked Below 8hrs       10
2001    10     Worked Above 8hrs       09
2001    10     Present                  0   <------ current value

以下が基準です

criteria
===========
Present Count of 'x'th Month = SUM(Worked Below 8hrs count of 'x'th month) + 
                               SUM(Worked Above 8hrs count of 'x'th month )

                                    ;where x is the month

上記の基準を満たす次の結果が欲しい

           **** Expected Result ****
===============================================
Year   month  Category               Count_days
================================================
2001    09     Leave                   03
2001    09     Worked Below 8hrs       18
2001    09     Worked Above 8hrs       05
2001    09     Present                 23  <-----(expecting  sum 18+05 =23)
2001    10     Leave                   01
2001    10     Worked Below 8hrs       10
2001    10     Worked Above 8hrs       09
2001    10     Present                 19  <-----(expecting sum 10+09 = 19) 

問題は、元の結果が非常に複雑なクエリによって生成されるため、同じセットを再度呼び出すことができないことです。つまり、これを使用できません (これにより、アプリケーションのパフォーマンスが低下します) =================

select * from original (some join) select * from original

単一のクエリを使用する必要があるか、サブクエリ、集計関数の使用などが必要になる場合があります。

予想される結果を生成するための集計トリックを期待していますか????

みんな助けてください....

4

2 に答える 2

3

合計を分析関数として使用できます

SELECT 
year, month, cat, count_days as count_days_orig,
case cat 
  when 'Present' 
  then 
     sum (
           case 
             when cat in ('Worked Below 8hrs', 'Worked Above 8hrs') 
             then count_days 
             else 0 
           end
          ) 
     over (partition by year, month) 
  else count_days 
end                                    as count_days_calc
FROM 
(
SELECT 2001    as year, 09 as month ,   'Leave            ' as cat ,      03 as count_days FROM dual
UNION all                                                           
SELECT 2001    as year, 09 as month ,   'Worked Below 8hrs' as cat ,      18 as count_days FROM dual
UNION all                                                           
SELECT 2001    as year, 09 as month ,   'Worked Above 8hrs' as cat ,      05 as count_days FROM dual
UNION all                                                           
SELECT 2001    as year, 09 as month ,   'Present'           as cat ,      0 as count_days FROM dual 
UNION all                                                           
SELECT 2001    as year, 10 as month ,   'Leave            ' as cat ,      01 as count_days FROM dual
UNION all                                                           
SELECT 2001    as year, 10 as month ,   'Worked Below 8hrs' as cat ,      10 as count_days FROM dual
UNION all                                                           
SELECT 2001    as year, 10 as month ,   'Worked Above 8hrs' as cat ,      09 as count_days FROM dual
UNION all                                                           
SELECT 2001    as year, 10 as month ,   'Present'            as cat ,      0 as count_days FROM dual  
)
;

     year     month     cat    count_days_orig  count_days_calc
--------------------------------------------------------------------------
    2001    9   Leave               3           3
    2001    9   Worked Below 8hrs   18          18
    2001    9   Worked Above 8hrs   5           5
    2001    9   Present             0           23
    2001    10  Leave               1           1
    2001    10  Worked Below 8hrs   10          10
    2001    10  Worked Above 8hrs   9           9
    2001    10  Present             0           19
于 2013-06-11T11:21:37.553 に答える
0

このようなもので、列名が正しいかどうかわかりません。

SELECT Year, month, category, 
   CASE Category
       WHEN 'Present'
          THEN (
          SELECT Sum(T2.Count_days)
          FROM table T2
          WHERE T2.year = T.year
          AND T2.month = T.month
          AND T2.Category NOT IN ('Present', 'Leave')
          )
       ELSE Count_days
   END
FROM table T

しかし、これは本当に間違った設計のように感じます...

于 2013-06-11T11:17:25.400 に答える