我可以使用pivot来添加总和中的列吗?

时间:2014-08-06 17:13:41

标签: sql sql-server-2008

我有一个查询,我得到了不同问题q1-q5的评级平均值。

是否可以添加q1-q5并使用pivot将其除以计数?

我尝试在下面进行查询:

SELECT 
   employeedept,YEAR_cse,csedept_name,
   SUM(January) as January, SUM(February) as February,
   SUM(March) as March, SUM(April) as April,
   SUM(May) as May, SUM(June) as June,
   SUM(July) as July, SUM(August) as August,
   SUM(September) as September, SUM(October) as October,
   SUM(November) as November, SUM(December) as December
FROM  
   (SELECT 
       CAST(employeedept AS INT) as dept,
       ROUND(AVG(case when rating1 > 0 THEN CAST(rating1 AS FLOAT) ELSE null END), 2) as q1,
       ROUND(AVG(case when rating2 > 0 THEN CAST(rating2 AS FLOAT) ELSE null END), 2) as q2,
       ROUND(AVG(case when rating3 > 0 THEN CAST(rating3 AS FLOAT) ELSE null END), 2) as q3,
       ROUND(AVG(case when rating4 > 0 THEN CAST(rating4 AS FLOAT) ELSE null END), 2) as q4,
       ROUND(AVG(case when rating5 > 0 THEN CAST(rating5 AS FLOAT) ELSE null END), 2) as q5,
       count(*) as 'totalstars',
       month_cse = datename(month, approveddate),
       YEAR_cse = YEAR(approveddate)
    FROM 
       CSEReduxResponses
    WHERE 
       execoffice_status = 1
       and YEAR ([approveddate]) =2014  
    GROUP BY 
       month(approveddate), YEAR(approveddate),
       DATENAME(month,approveddate), employeedept) AS r   
JOIN 
    CSEReduxDepts d ON d.csedept_id = r.employeedept
                    AND YEAR_cse is NOT NULL
PIVOT( SUM(q1+q2+q3+q4+q5/totalstars)
    FOR [month_cse] IN (
        [January],[February],[March],[April],[May],[June],[July],[August], [September],[October],[November],[December]
        )) AS pvt 
Group BY     employeedept,YEAR_cse,csedept_name     

使用此查询我收到此错误:

  

Msg 102,Level 15,State 1,Line 21
  “+”附近的语法不正确。'

我想做的是能够总结q1-q5 / totalstars,使用pivot可以这样吗?

如果我运行第二个select语句,它会给我正确的结果。

1 个答案:

答案 0 :(得分:1)

我认为这应该是您需要的最终查询。 我已经写了count函数来做平均值,如果你的值为null,那么它将为特定列返回0

Lets say 
rating1 = null then ISNULL(COUNT(rating1),0) = 0
rating2 = 2    then ISNULL(COUNT(rating1),0) = 1
rating3 = 3    then ISNULL(COUNT(rating1),0) = 1

so on....

这是查询。我希望这会对你有所帮助。

SELECT 
        employeedept,
        YEAR_cse,
        csedept_name,
        SUM(January) as January,
        SUM(February) as February,
        SUM(March) as March,
        SUM(April) as April,
        SUM(May) as May,
        SUM(June) as June,
        SUM(July) as July,
        SUM(August) as August,
        SUM(September) as September,
        SUM(October) as October,
        SUM(November) as November,
        SUM(December) as December
        FROM 
        (
            SELECT employeedept,
        (
            ROUND(AVG(case when rating1>0 THEN CAST(rating1 AS FLOAT) ELSE 0 END), 2) +
            ROUND(AVG(case when rating2>0 THEN CAST(rating2 AS FLOAT) ELSE 0 END), 2) +
            ROUND(AVG(case when rating3>0 THEN CAST(rating3 AS FLOAT) ELSE 0 END), 2) +
            ROUND(AVG(case when rating4>0 THEN CAST(rating4 AS FLOAT) ELSE 0 END), 2) +
            ROUND(AVG(case when rating5>0 THEN CAST(rating5 AS FLOAT) ELSE 0 END), 2)) 
            /(
            ISNULL(COUNT(rating1),0) + 
            ISNULL(COUNT(rating2),0) + 
            ISNULL(COUNT(rating3),0) + 
            ISNULL(COUNT(rating4),0)+ 
            ISNULL(COUNT(rating5),0)) as AG,
            count(*) as 'totalstars',month_cse= datename(month,approveddate),YEAR_cse =YEAR(approveddate)
        FROM 
            CSEReduxResponses   
        Where 
            YEAR(approveddate) =2014            
            and execoffice_status=1
        group by 
            employeedept,
            month(approveddate),
            YEAR(approveddate),
            DATENAME(month,approveddate)        
      )AS r   
        JOIN CSEReduxDepts d ON d.csedept_id = r.employeedept
        AND YEAR_cse is NOT NULL
    PIVOT( 
            SUM(AG)
            FOR [month_cse] IN (
            [January],[February],[March],[April],[May],[June],[July],[August], [September],[October],[November],[December]
          )) AS pvt 
    Group BY employeedept,YEAR_cse,csedept_name
相关问题