[英]How to make PIVOT a table / Cross tab query?
我已經執行了一條SELECT
語句來獲取以下輸出:
MOVIE Critic Type Average Rating
------------------------ ------------ --------------
30 Minutes or Less Critic 2.00
30 Minutes or Less User 4.20
A Lonely Place to Die Critic 10.00
A Lonely Place to Die User 8.50
Taken Critic 6.17
Taken User 7.27
Taken 2 Critic 4.00
Taken 2 User 6.29
8 rows selected
這是SELECT
語句:
SELECT MovieTitle AS "MOVIE", TBLCRITICCLASS.CRITICCLASSDESC AS "Critic Type", AVG(TBLREVIEW.REVIEWSTAR) AS "Average Rating"
FROM TBLMOVIE
INNER JOIN TBLREVIEW ON TBLMOVIE.MOVIEID = TBLREVIEW.MOVIEID
INNER JOIN TBLCRITIC ON TBLREVIEW.CRITICID = TBLCRITIC.CRITICID
INNER JOIN TBLCRITICCLASS ON TBLCRITIC.CRITICCLASSID = TBLCRITICCLASS.CRITICCLASSID
GROUP BY MovieTitle, TBLCRITICCLASS.CRITICCLASSDESC
ORDER BY Movietitle;
我想用PIVOT
將此表轉換為此輸出,以得到具有評論者評分和用戶評分的輸出,因為它是其自己的類別:
MOVIE Critic Rating User Rating
------------------------ ------------- -----------
30 Minutes or Less 2.00 4.20
A Lonely Place to Die 10.00 8.50
Taken 6.17 7.27
Taken 2 4.00 6.29
我嘗試這樣做:
SELECT * FROM
(
SELECT MovieTitle AS "MOVIE", AVG(TBLREVIEW.REVIEWSTAR) AS "Critic Rating", AVG(TBLREVIEW.REVIEWSTAR) AS "User Rating"
FROM TBLMOVIE
INNER JOIN TBLREVIEW ON TBLMOVIE.MOVIEID = TBLREVIEW.MOVIEID
INNER JOIN TBLCRITIC ON TBLREVIEW.CRITICID = TBLCRITIC.CRITICID
INNER JOIN TBLCRITICCLASS ON TBLCRITIC.CRITICCLASSID = TBLCRITICCLASS.CRITICCLASSID
GROUP BY MovieTitle, TBLCRITICCLASS.CRITICCLASSDESC
ORDER BY Movietitle
)
PIVOT
(
AVG(TBLREVIEW.REVIEWSTAR) AS "Critic Rating"
FOR TBLREVIEW.REVIEWSTAR IN (TBLCRITICCLASS.CRITICCLASSDESC)
AVG(TBLREVIEW.REVIEWSTAR) AS "User Rating"
FOR TBLREVIEW.REVIEWSTAR IN (TBLCRITICCLASS.CRITICCLASSDESC)
)
我收到錯誤,這可能是由於我缺乏對子查詢的技巧,我想了解為什么我沒有得到我喜歡的輸出以及如何解決它。
編輯:
以下是相關的表:
您只是將樞紐聲明弄錯了。 您可以將查詢替換為下面的CTE,它應該可以工作。
SELECT *
FROM (SELECT MovieTitle AS "MOVIE"
, TBLCRITICCLASS.CRITICCLASSDESC AS "Critic Type"
, AVG(TBLREVIEW.REVIEWSTAR) AS "Average Rating"
FROM TBLMOVIE
INNER JOIN TBLREVIEW
ON TBLMOVIE.MOVIEID = TBLREVIEW.MOVIEID
INNER JOIN TBLCRITIC
ON TBLREVIEW.CRITICID = TBLCRITIC.CRITICID
INNER JOIN TBLCRITICCLASS
ON TBLCRITIC.CRITICCLASSID = TBLCRITICCLASS.CRITICCLASSID
GROUP BY MovieTitle, TBLCRITICCLASS.CRITICCLASSDESC
)
PIVOT (AVG("Average Rating") for "Critic Type"
in ('Critic' as "Critic Rating", 'User' as "User Rating")))
ORDER BY Movie
關於“為什么我沒有得到我的首選輸出”
您正在使用“臨界類型”,因為它具有兩個值(“臨界”和“用戶”),所以avg
是有意義的; 但在您的示例中,每條記錄只有1個值,因此最小/最大也會起作用。
在數據透視圖中,您可以在數據透視的“輸入”部分中指定每一列,讓數據庫引擎根據“關鍵類型”列中的值確定如何組織數據。
因為必須指定每個值,所以如果沒有動態SQL,就無法擁有動態范圍。
注意:如果您希望使用與“ for”數據透視表字段中的值不同的名稱,則可以對數據透視表的“ IN”部分中的列進行別名命名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.