2016-11-30 69 views
1

我已經做了SELECT語句來得到這個輸出:如何使PIVOT成爲表格/交叉表格查詢?

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) 
) 

我得到的錯誤,這可能是由於我缺乏與子查詢的技巧,我想知道爲什麼我沒有得到我的首選輸出,以及如何解決它。

編輯:

下面是相關聯的表:

File1 (Pastebin)

File2 (Pastebin)

+0

幾件事情...'PIVOT'已經是一個聚集函數(如'GROUP BY'然後'選擇AVG(...)'),所以你不需要組,採取數據透視前的平均值;當你轉動時,'AVG()'可以完成。然後,甚至不要在子查詢中使用ORDER BY;如果需要,唯一的'ORDER BY'應該在外部查詢中。最後,'PIVOT'語法不對 - @xQbert顯示瞭如何在他的答案中做到這一點。如果您將添加到您的問題以顯示錶名和列,我們可以幫助您在一個語句中編寫您當前的查詢和PIVOT。 (我可以從你目前的嘗試中猜出,但我不會。) – mathguy

+0

我已經將表格添加到pastebin鏈接。 –

回答

2

請讓你的支點說法是錯誤的。你可以用你的查詢替換下面的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 

至於「爲什麼我沒有得到我的首選輸出」

您piviting的「批判型」的,你有兩個值(「評論家」和用戶「)將彙集起來avg品牌感;但在你的例子中,每個記錄只有1個值,所以最小/最大值也可以。

在數據透視表中,您可以指定數據透視表的「in」部分中的每個列,讓數據庫引擎根據「Critic Type」列中的值確定如何處理數據。

因爲您必須指定每個值,所以不能有動態範圍,沒有動態SQL。

注意:如果您希望使用與「for」透視字段中的值不同的名稱,則可以在透視的「IN」部分中對列進行別名。

enter image description here

+0

任何方式以類似的方式做我用作示例(與子查詢?)我不熟悉CTE。 –

+0

我將你的查詢合併到數據透視表中。在沒有2個查詢的開銷的情況下,可能有更有效的方法來做到這一點;我目前沒有時間來解決這個細節問題。 – xQbert