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

您可以使用 sum 作为分析函数

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 回答