2014-01-08 30 views
0

有2個簡單的表格SQL查詢的問題轉MySQL的

People: 
person_id 
Name 

Reading assestment 
date 
person_id 
quality 
speed 

試圖創建SQL查詢

SELECT 
    AVG(r.quality), 
    AVG(r.speed), 
FROM reading_assestment r,people p 
where r.person_id =p.person_id 
    and person_id="3" 

電流輸出:

Quality Speed 
77  65 

結果我要找:

Assestment Value 
Quality  77 
Speed  65 

這與轉置,樞軸有關。

回答

1

的最普遍的方式是先從您的查詢,然後UNPIVOT使用單獨的邏輯:

select (case when n = 1 then 'Quality' else 'Speed' end) as Assessment, 
     (case when n = 1 then avg_quality else avg_speed end) as Value 
from (select AVG(r.quality) as avg_quality, AVG(r.speed) as avg_speed 
     from reading_assestment r join 
      people p 
      on r.person_id =p.person_id 
     where person_id = 3 
    ) t cross join 
    (select 1 as n union all select 2) n 
+0

喜歡聰明的使用交叉連接!我正在考慮做'(SELECT * FROM people WHERE person_id = 3 UNION ALL SELECT * FROM people WHERE person_id = 3)''然後加入reading_assestment – hashbrown

0
SELECT 
    AggResults.person_id AS person_id, 
    Assesment.Name   AS AssessmentName, 
    CASE WHEN Assessment.Name = 'Quality' THEN AggResults.AvgQuality 
     WHEN Assessment.Name = 'Speed' THEN AggResults.AvgSpeed 
             ELSE NULL 
    END     AS AssessmentValue 
FROM 
(
    SELECT 
    people.person_id AS person_id, 
    AVG(quality)  AS AvgQuality, 
    AVG(speed)   AS AvgSpeed 
    FROM 
    reading_assessment 
    INNER JOIN 
    people 
     ON reading_assessment.person_id = people.person_id 
    GROUP BY 
    people.person_id 
) 
    AS AggResults 
CROSS JOIN 
(
    SELECT 'Quality' AS Name 
    UNION ALL 
    SELECT 'Speed' AS Name 
) 
    AS Assessment 
WHERE 
    AggResults.person_id = 3 

我感動= 3對外部查詢的,只是爲了方便使用。大多數優化器會同樣對待這兩個選項。