我有一个查询,我得到了不同问题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语句,它会给我正确的结果。
答案 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