2012-09-21 81 views
0

我有这个疑问,我想组由surveyname但即时得到这个错误:SQL Server 2008的数据透视表汇总函数问题

Msg 8120, Level 16, State 1, Line 1
Column 'pvt.Follow Up' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

这是查询:

SELECT 
    surveyname, [Follow Up] AS Follow_Up, [Ambiance] AS Ambiance, 
    [Consultation] AS Consultation, [Procedure/Service] AS Procedure_Service 
FROM 
    (SELECT 
     s.name surveyname, q.question, subq.answer subquestion,aw.answerweight, 
     aw.score, rc.categoryname, sc.cweight 
    FROM survey.dbo.results r 
    JOIN survey.dbo.questions q ON r.questionidfk = q.id 
    LEFT JOIN survey.dbo.answers subq ON r.itemidfk = subq.id 
    LEFT JOIN survey.dbo.answers a ON r.answeridfk = a.id 
    JOIN survey.dbo.surveys s ON q.surveyidfk = s.id 
    join sigweb.dbo.survey_types_main stm on s.id = stm.surveyidfk 
    join survey.dbo.survey_results sr on r.owneridfk = sr.ownerid 
    join sigweb.dbo.BosleySurvey bs on bs.contactid = sr.contactid and stm.clientsurveytypeid = bs.surveytype 
    join sigweb.dbo.contact c on sr.contactid = c.contactid 
    join sigweb.dbo.patient p on p.contactid = c.contactid 
    join sigweb.dbo.doctor d on p.doctorid = d.doctorid 
    join sigweb.dbo.survey_tracking st on st.contactid = c.contactID and st.surveytypeid = stm.surveytypeid 
    left join survey.dbo.answerweighting aw on isnull(r.itemidfk, r.questionidfk) = aw.questionitemidfk and r.answeridfk = aw.answeridfk 
    left join survey.dbo.rating_categories rc on aw.categoryidfk = rc.id 
    left join survey.dbo.survey_categories sc on aw.categoryidfk = sc.categoryidfk and s.id = sc.surveyidfk 
    where 
     aw.answerWeight is not null) ps 
PIVOT 
(
    AVG(score) 
    FOR categoryname IN 
    ([Follow Up], [Ambiance], [Consultation], [Procedure/Service]) 
) AS pvt 

组由surveyname

这是结果即时得到的一例

SURVEYNAME  FOLLOW_UP Ambiance Consultation Procedure_Service 
Review    NULL  NULL NULL   9.81 
Review    9.54  NULL NULL   NULL 
Consultation  5  NULL NULL   NULL 
Consultation  NULL  5   NULL   NULL 
Consultation  NULL  5   NULL   NULL 
Consultation  NULL  5   NULL   NULL 
Consultation  NULL  5   NULL   NULL 
Consultation  NULL  5   NULL   NULL 
Consultation  NULL  NULL 5   NULL 
Consultation  5  NULL NULL   NULL 
Consultation  NULL  NULL 5   NULL 

这是枢转之前的数据的一个示例:

Review   6 Follow Up 
Review   9 Procedure/Service 
Consultation 5 Ambiance 
Consultation 5 Ambiance 
Consultation 5 Ambiance 
Consultation 5 Ambiance 
Consultation 5 Ambiance 
Consultation 5 Ambiance 
Consultation 5 Consultation 
Consultation 5 Consultation 

的想法是组由surveyname和仅具有两个结果到底。

+0

我增加了结果的支点前 – Geo

+1

尝试删除从内部选择,你是不包括在最终'SELECT'这些领域 - 'q.question,subq.answer subquestion ,aw.answerweight,sc.cweight'。这些字段可能使行不同,所以'GROUP BY'不起作用。 – Taryn

+0

添加此为答案,以便我可以接受它。我删除了子查询中的额外列,即使没有'group by'函数 – Geo

回答

1

看来,要包括在内部SELECT太多的列,尽量去除列:

q.question, subq.answer subquestion, aw.answerweight, sc.cweight 

他们最有可能使行DISTINCT所以GROUP BY不能正常工作。所以,你的查询将是:

SELECT surveyname, 
    [Follow Up] AS Follow_Up, 
    [Ambiance] AS Ambiance, 
    [Consultation] AS Consultation, 
    [Procedure/Service] AS Procedure_Service 
FROM 
(
    SELECT s.name surveyname, 
     aw.score, 
     rc.categoryname, 
    FROM survey.dbo.results r 
    JOIN survey.dbo.questions q 
     ON r.questionidfk = q.id 
    LEFT JOIN survey.dbo.answers subq 
     ON r.itemidfk = subq.id 
    LEFT JOIN survey.dbo.answers a 
     ON r.answeridfk = a.id 
    JOIN survey.dbo.surveys s 
     ON q.surveyidfk = s.id 
    join sigweb.dbo.survey_types_main stm 
     on s.id = stm.surveyidfk 
    join survey.dbo.survey_results sr 
     on r.owneridfk = sr.ownerid 
    join sigweb.dbo.BosleySurvey bs 
     on bs.contactid = sr.contactid 
      and stm.clientsurveytypeid = bs.surveytype 
    join sigweb.dbo.contact c 
     on sr.contactid = c.contactid 
    join sigweb.dbo.patient p 
     on p.contactid = c.contactid 
    join sigweb.dbo.doctor d on p.doctorid = d.doctorid 
    join sigweb.dbo.survey_tracking st 
     on st.contactid = c.contactID 
      and st.surveytypeid = stm.surveytypeid 
    left join survey.dbo.answerweighting aw 
     on isnull(r.itemidfk, r.questionidfk) = aw.questionitemidfk 
      and r.answeridfk = aw.answeridfk 
    left join survey.dbo.rating_categories rc 
     on aw.categoryidfk = rc.id 
    left join survey.dbo.survey_categories sc 
     on aw.categoryidfk = sc.categoryidfk and s.id = sc.surveyidfk 
    where aw.answerWeight is not null 
) ps 
PIVOT 
(
    AVG(score) 
    FOR categoryname IN 
    ([Follow Up], [Ambiance], [Consultation], [Procedure/Service]) 
) AS pvt 
1

我不知道错误来自您发布的内容(我假设它是当您尝试在您发布的查询的末尾添加GROUP BY SurveyName),但是您需要删除冗余列你的子查询,所以你只能选择3列,你需要,surveynamescorecategoryname

SELECT 
    surveyname, [Follow Up] AS Follow_Up, [Ambiance] AS Ambiance, 
    [Consultation] AS Consultation, [Procedure/Service] AS Procedure_Service 
FROM 
    (SELECT 
     s.name surveyname, aw.score, rc.categoryname 
    FROM survey.dbo.results r 
    JOIN survey.dbo.questions q ON r.questionidfk = q.id 
    LEFT JOIN survey.dbo.answers subq ON r.itemidfk = subq.id 
    LEFT JOIN survey.dbo.answers a ON r.answeridfk = a.id 
    JOIN survey.dbo.surveys s ON q.surveyidfk = s.id 
    join sigweb.dbo.survey_types_main stm on s.id = stm.surveyidfk 
    join survey.dbo.survey_results sr on r.owneridfk = sr.ownerid 
    join sigweb.dbo.BosleySurvey bs on bs.contactid = sr.contactid and stm.clientsurveytypeid = bs.surveytype 
    join sigweb.dbo.contact c on sr.contactid = c.contactid 
    join sigweb.dbo.patient p on p.contactid = c.contactid 
    join sigweb.dbo.doctor d on p.doctorid = d.doctorid 
    join sigweb.dbo.survey_tracking st on st.contactid = c.contactID and st.surveytypeid = stm.surveytypeid 
    left join survey.dbo.answerweighting aw on isnull(r.itemidfk, r.questionidfk) = aw.questionitemidfk and r.answeridfk = aw.answeridfk 
    left join survey.dbo.rating_categories rc on aw.categoryidfk = rc.id 
    left join survey.dbo.survey_categories sc on aw.categoryidfk = sc.categoryidfk and s.id = sc.surveyidfk 
    where 
     aw.answerWeight is not null) ps 
PIVOT 
(
    AVG(score) 
    FOR categoryname IN 
    ([Follow Up], [Ambiance], [Consultation], [Procedure/Service]) 
) AS pvt 

在你被q.question, subq.answer subquestion,aw.answerweight, sc.cweight,因为它们包含在子查询中还分组您的最终结果的背景,但由于不在选择列表中,您没有立即看到这种效果。

+0

我删除q.question,subq.answer subquestion,aw.answerweight,sc.cweight和我的查询工程 – Geo