SQL Server 2008数据透视表聚合函数问题

时间:2012-09-21 18:49:32

标签: sql sql-server-2008 pivot

我有这个查询,我试图通过surveyname分组,但我得到这个错误:

  

Msg 8120,Level 16,State 1,Line 1
  列'pvt.Follow Up'在选择列表中无效,因为它不包含在聚合函数或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, 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

group by surveyyname

这是我得到的结果的一个例子

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进行分组,最后只有两个结果。

2 个答案:

答案 0 :(得分: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对最终结果进行分组,因为它们包含在子查询中,但因为它们不在选择列表中,所以您没有立即看到它产生的效果。

答案 1 :(得分: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